You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by db...@apache.org on 2016/02/24 19:17:59 UTC
[01/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Repository: ambari
Updated Branches:
refs/heads/trunk db999ae82 -> b988562aa
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/test/unit/controllers/files_test.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/test/unit/controllers/files_test.js b/contrib/views/files/src/main/resources/ui/test/unit/controllers/files_test.js
deleted file mode 100644
index 516e4df..0000000
--- a/contrib/views/files/src/main/resources/ui/test/unit/controllers/files_test.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-moduleFor('controller:files', 'App.FilesController', {
- needs:['controller:file']
-});
-
-test('Property "isRootDir" is true when in root directory', function () {
-
- var cntr = this.subject();
- Ember.run(function() {
- equal(cntr.get('path')==='/', cntr.get('isRootDir') , 'isRootDir is set right');
- });
-
-
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/testem.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/testem.json b/contrib/views/files/src/main/resources/ui/testem.json
new file mode 100644
index 0000000..0f35392
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/testem.json
@@ -0,0 +1,12 @@
+{
+ "framework": "qunit",
+ "test_page": "tests/index.html?hidepassed",
+ "disable_watching": true,
+ "launch_in_ci": [
+ "PhantomJS"
+ ],
+ "launch_in_dev": [
+ "PhantomJS",
+ "Chrome"
+ ]
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/.jshintrc
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/.jshintrc b/contrib/views/files/src/main/resources/ui/tests/.jshintrc
new file mode 100644
index 0000000..6ec0b7c
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/tests/.jshintrc
@@ -0,0 +1,52 @@
+{
+ "predef": [
+ "document",
+ "window",
+ "location",
+ "setTimeout",
+ "$",
+ "-Promise",
+ "define",
+ "console",
+ "visit",
+ "exists",
+ "fillIn",
+ "click",
+ "keyEvent",
+ "triggerEvent",
+ "find",
+ "findWithAssert",
+ "wait",
+ "DS",
+ "andThen",
+ "currentURL",
+ "currentPath",
+ "currentRouteName"
+ ],
+ "node": false,
+ "browser": false,
+ "boss": true,
+ "curly": true,
+ "debug": false,
+ "devel": false,
+ "eqeqeq": true,
+ "evil": true,
+ "forin": false,
+ "immed": false,
+ "laxbreak": false,
+ "newcap": true,
+ "noarg": true,
+ "noempty": false,
+ "nonew": false,
+ "nomen": false,
+ "onevar": false,
+ "plusplus": false,
+ "regexp": false,
+ "undef": true,
+ "sub": true,
+ "strict": false,
+ "white": false,
+ "eqnull": true,
+ "esnext": true,
+ "unused": true
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/helpers/destroy-app.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/helpers/destroy-app.js b/contrib/views/files/src/main/resources/ui/tests/helpers/destroy-app.js
new file mode 100644
index 0000000..dfabf85
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/tests/helpers/destroy-app.js
@@ -0,0 +1,23 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default function destroyApp(application) {
+ Ember.run(application, 'destroy');
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/helpers/flash-message.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/helpers/flash-message.js b/contrib/views/files/src/main/resources/ui/tests/helpers/flash-message.js
new file mode 100644
index 0000000..6c1fb29
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/tests/helpers/flash-message.js
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FlashObject from 'ember-cli-flash/flash/object';
+
+const { K } = Ember;
+
+FlashObject.reopen({ init: K });
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/helpers/module-for-acceptance.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/helpers/module-for-acceptance.js b/contrib/views/files/src/main/resources/ui/tests/helpers/module-for-acceptance.js
new file mode 100644
index 0000000..05aa014
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/tests/helpers/module-for-acceptance.js
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { module } from 'qunit';
+import startApp from '../helpers/start-app';
+import destroyApp from '../helpers/destroy-app';
+
+export default function(name, options = {}) {
+ module(name, {
+ beforeEach() {
+ this.application = startApp();
+
+ if (options.beforeEach) {
+ options.beforeEach.apply(this, arguments);
+ }
+ },
+
+ afterEach() {
+ destroyApp(this.application);
+
+ if (options.afterEach) {
+ options.afterEach.apply(this, arguments);
+ }
+ }
+ });
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/helpers/resolver.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/helpers/resolver.js b/contrib/views/files/src/main/resources/ui/tests/helpers/resolver.js
new file mode 100644
index 0000000..b7193ba
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/tests/helpers/resolver.js
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Resolver from 'ember-resolver';
+import config from '../../config/environment';
+
+const resolver = Resolver.create();
+
+resolver.namespace = {
+ modulePrefix: config.modulePrefix,
+ podModulePrefix: config.podModulePrefix
+};
+
+export default resolver;
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/helpers/start-app.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/helpers/start-app.js b/contrib/views/files/src/main/resources/ui/tests/helpers/start-app.js
new file mode 100644
index 0000000..7b25773
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/tests/helpers/start-app.js
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import Application from '../../app';
+import config from '../../config/environment';
+
+export default function startApp(attrs) {
+ let application;
+
+ let attributes = Ember.merge({}, config.APP);
+ attributes = Ember.merge(attributes, attrs); // use defaults, but you can override;
+
+ Ember.run(() => {
+ application = Application.create(attributes);
+ application.setupForTesting();
+ application.injectTestHelpers();
+ });
+
+ return application;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/index.html
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/index.html b/contrib/views/files/src/main/resources/ui/tests/index.html
new file mode 100644
index 0000000..8faf5f9
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/tests/index.html
@@ -0,0 +1,52 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <title>FilesView Tests</title>
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ {{content-for "head"}}
+ {{content-for "test-head"}}
+
+ <link rel="stylesheet" href="assets/vendor.css">
+ <link rel="stylesheet" href="assets/files-view.css">
+ <link rel="stylesheet" href="assets/test-support.css">
+
+ {{content-for "head-footer"}}
+ {{content-for "test-head-footer"}}
+ </head>
+ <body>
+ {{content-for "body"}}
+ {{content-for "test-body"}}
+
+ <script src="testem.js" integrity=""></script>
+ <script src="assets/vendor.js"></script>
+ <script src="assets/test-support.js"></script>
+ <script src="assets/files-view.js"></script>
+ <script src="assets/tests.js"></script>
+ <script src="assets/test-loader.js"></script>
+
+ {{content-for "body-footer"}}
+ {{content-for "test-body-footer"}}
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/integration/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/integration/.gitkeep b/contrib/views/files/src/main/resources/ui/tests/integration/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/test-helper.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/test-helper.js b/contrib/views/files/src/main/resources/ui/tests/test-helper.js
new file mode 100644
index 0000000..64814c1
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/tests/test-helper.js
@@ -0,0 +1,26 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import resolver from './helpers/resolver';
+import './helpers/flash-message';
+
+import {
+ setResolver
+} from 'ember-qunit';
+
+setResolver(resolver);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/tests/unit/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/tests/unit/.gitkeep b/contrib/views/files/src/main/resources/ui/tests/unit/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/vendor/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/vendor/.gitkeep b/contrib/views/files/src/main/resources/ui/vendor/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/vendor/js/bsPopover.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/vendor/js/bsPopover.js b/contrib/views/files/src/main/resources/ui/vendor/js/bsPopover.js
deleted file mode 100644
index 90c1392..0000000
--- a/contrib/views/files/src/main/resources/ui/vendor/js/bsPopover.js
+++ /dev/null
@@ -1,190 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-var template = '' +
- '<div class="arrow"></div>' +
- '{{#if title}}' +
- ' <h3 class="popover-title">{{title}}</h3>' +
- '{{/if}}' +
- '<div class="popover-content">' +
- '{{#if content}}' +
- ' {{content}}' +
- '{{else}}' +
- '{{yield}}' +
- '{{/if}}' +
- ' </div>';
-
-Ember.TEMPLATES["components/bs-popover"] = Ember.Handlebars.compile(template);
-
-Ember.BsPopoverComponent = Ember.Component.extend({
- classNames: 'popover',
- classNameBindings: ['fade', 'in', 'top', 'left', 'right', 'bottom'],
-
- top: function(){
- return this.get('realPlacement')=='top';
- }.property('realPlacement'),
- left: function(){
- return this.get('realPlacement')=='left';
- }.property('realPlacement'),
- right: function(){
- return this.get('realPlacement')=='right';
- }.property('realPlacement'),
- bottom: function(){
- return this.get('realPlacement')=='bottom';
- }.property('realPlacement'),
-
- title: '',
- content: '',
- html: false,
- delay: 0,
- isVisible: false,
- animation: true,
- fade: function(){
- return this.get('animation');
- }.property('animation'),
- in: function(){
- return this.get('isVisible');
- }.property('isVisible'),
- triggers: 'hover focus',
- placement: 'top',
- onElement: null,
- $element: null,
- $tip: null,
- inserted: false,
-
- styleUpdater: function(){
- if( !this.$tip || !this.get('isVisible')){
- return;
- }
- this.$tip.css('display','block');
- var placement = this.get('realPlacement');
- var pos = this.getPosition();
- var actualWidth = this.$tip[0].offsetWidth;
- var actualHeight = this.$tip[0].offsetHeight;
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight);
-
- this.$tip.css('top',calculatedOffset.top);
- this.$tip.css('left',calculatedOffset.left);
- if(this.firstTime){
- this.firstTime = false;
- this.styleUpdater();
- this.firstTime = true;
- }
- }.observes('content','realPlacement','inserted', 'isVisible'),
-
-
- didInsertElement: function(){
-
- this.$tip = this.$();
- if(this.get('onElement')){
- this.$element=$('#'+this.get('onElement'));
- }else if(this.$tip.prev(':not(script)').length){
- this.$element = this.$tip.prev(':not(script)');
- }else{
- this.$element = this.$tip.parent(':not(script)');
- }
-
-
- var triggers = this.triggers.split(' ');
-
- for (var i = triggers.length; i--;) {
- var trigger = triggers[i];
-
- if (trigger == 'click') {
- this.$element.on('click',$.proxy(this.toggle, this));
- } else if (trigger != 'manual') {
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focus';
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur';
-
- this.$element.on(eventIn, $.proxy(this.enter, this));
- this.$element.on(eventOut, $.proxy(this.leave, this));
- }
- }
- this.set('inserted',true);
- },
-
-
- toggle: function(){
- this.toggleProperty('isVisible');
- },
-
- enter: function(){
- this.set('isVisible',true);
- },
-
- leave: function(){
- this.set('isVisible',false);
- },
-
- afterRender: function(){
- this.notifyPropertyChange('content');
- },
-
-
- realPlacement: function(){
-
- if(!this.$tip) return null;
- var placement = this.get('placement') || '';
- var autoToken = /\s?auto?\s?/i;
- var autoPlace = autoToken.test(placement);
- if (autoPlace)
- placement = placement.replace(autoToken, '') || 'top';
-
- var pos = this.getPosition();
- var actualWidth = this.$tip[0].offsetWidth;
- var actualHeight = this.$tip[0].offsetHeight;
-
- if (autoPlace) {
- var $parent = this.$element.parent();
-
- var orgPlacement = placement;
- var docScroll = document.documentElement.scrollTop || document.body.scrollTop;
- var parentWidth = $parent.outerWidth();
- var parentHeight = $parent.outerHeight();
- var parentLeft = $parent.offset().left;
-
- placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
- placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
- placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
- placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
- placement;
- }
- return placement;
-
- }.property('placement','inserted'),
-
-
- hasContent: function () {
- return this.get('title');
- },
-
- getPosition: function () {
- var el = this.$element[0];
- return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
- width: el.offsetWidth, height: el.offsetHeight
- }, this.$element.offset());
- },
-
-
- getCalculatedOffset: function (placement, pos, actualWidth, actualHeight) {
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
- }
-
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/vendor/js/ember-cloaking.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/vendor/js/ember-cloaking.js b/contrib/views/files/src/main/resources/ui/vendor/js/ember-cloaking.js
deleted file mode 100644
index 235d1f6..0000000
--- a/contrib/views/files/src/main/resources/ui/vendor/js/ember-cloaking.js
+++ /dev/null
@@ -1,436 +0,0 @@
-(function () {
-
- /**
- Display a list of cloaked items
-
- @class CloakedCollectionView
- @extends Ember.CollectionView
- @namespace Ember
- **/
- Ember.CloakedCollectionView = Ember.CollectionView.extend({
- topVisible: null,
- bottomVisible: null,
- offsetFixedTopElement: null,
- offsetFixedBottomElement: null,
-//
-
-
- init: function() {
- var cloakView = this.get('cloakView'),
- idProperty = this.get('idProperty'),
- uncloakDefault = !!this.get('uncloakDefault');
-
- // Set the slack ratio differently to allow for more or less slack in preloading
- var slackRatio = parseFloat(this.get('slackRatio'));
- if (!slackRatio) { this.set('slackRatio', 1.0); }
-
- this.set('itemViewClass', Ember.CloakedView.extend({
- classNames: [cloakView + '-cloak'],
- cloaks: cloakView,
- preservesContext: this.get('preservesContext') === "true",
- cloaksController: this.get('itemController'),
- defaultHeight: this.get('defaultHeight'),
-
- init: function() {
- this._super();
-
- if (idProperty) {
- this.set('elementId', cloakView + '-cloak-' + this.get('content.' + idProperty));
- }
- if (uncloakDefault) {
- this.uncloak();
- } else {
- this.cloak();
- }
- }
- }));
-
- this._super();
- Ember.run.next(this, 'scrolled');
- },
-
-
- /**
- If the topmost visible view changed, we will notify the controller if it has an appropriate hook.
-
- @method _topVisibleChanged
- @observes topVisible
- **/
- _topVisibleChanged: Ember.observer('topVisible', function() {
- var controller = this.get('controller');
- if (controller.topVisibleChanged) { controller.topVisibleChanged(this.get('topVisible')); }
- }),
-
- /**
- If the bottommost visible view changed, we will notify the controller if it has an appropriate hook.
-
- @method _bottomVisible
- @observes bottomVisible
- **/
- _bottomVisible: Ember.observer('bottomVisible', function() {
- var controller = this.get('controller');
- if (controller.bottomVisibleChanged) { controller.bottomVisibleChanged(this.get('bottomVisible')); }
- }),
-
- /**
- Binary search for finding the topmost view on screen.
-
- @method findTopView
- @param {Array} childViews the childViews to search through
- @param {Number} windowTop The top of the viewport to search against
- @param {Number} min The minimum index to search through of the child views
- @param {Number} max The max index to search through of the child views
- @returns {Number} the index into childViews of the topmost view
- **/
- findTopView: function(childViews, viewportTop, min, max) {
- if (max < min) { return min; }
-
- var wrapperTop = this.get('wrapperTop')>>0;
-
- while(max>min){
- var mid = Math.floor((min + max) / 2),
- // in case of not full-window scrolling
- $view = childViews[mid].$(),
- viewBottom = $view.position().top + wrapperTop + $view.height();
-
- if (viewBottom > viewportTop) {
- max = mid-1;
- } else {
- min = mid+1;
- }
- }
-
- return min;
- },
-
-
- /**
- Determine what views are onscreen and cloak/uncloak them as necessary.
-
- @method scrolled
- **/
- scrolled: function() {
- if (!this.get('scrollingEnabled')) { return; }
-
- var childViews = this.get('childViews');
- if ((!childViews) || (childViews.length === 0)) { return; }
-
- var self = this,
- toUncloak = [],
- onscreen = [],
- onscreenCloaks = [],
- // calculating viewport edges
- $w = Ember.$(window),
- windowHeight = this.get('wrapperHeight') || ( window.innerHeight ? window.innerHeight : $w.height() ),
- windowTop = this.get('wrapperTop') || $w.scrollTop(),
- slack = Math.round(windowHeight * this.get('slackRatio')),
- viewportTop = windowTop - slack,
- windowBottom = windowTop + windowHeight,
- viewportBottom = windowBottom + slack,
- topView = this.findTopView(childViews, viewportTop, 0, childViews.length-1),
- bodyHeight = this.get('wrapperHeight') ? this.$().height() : Ember.$('body').height(),
- bottomView = topView,
- offsetFixedTopElement = this.get('offsetFixedTopElement'),
- offsetFixedBottomElement = this.get('offsetFixedBottomElement');
-
- if (windowBottom > bodyHeight) { windowBottom = bodyHeight; }
- if (viewportBottom > bodyHeight) { viewportBottom = bodyHeight; }
-
- if (offsetFixedTopElement) {
- windowTop += (offsetFixedTopElement.outerHeight(true) || 0);
- }
-
- if (offsetFixedBottomElement) {
- windowBottom -= (offsetFixedBottomElement.outerHeight(true) || 0);
- }
-
- // Find the bottom view and what's onscreen
- while (bottomView < childViews.length) {
- var view = childViews[bottomView],
- $view = view.$(),
- // in case of not full-window scrolling
- scrollOffset = this.get('wrapperTop') || 0,
- viewTop = $view.offset().top + scrollOffset,
- viewBottom = viewTop + $view.height();
-
- if (viewTop > viewportBottom) { break; }
- toUncloak.push(view);
-
- if (viewBottom > windowTop && viewTop <= windowBottom) {
- onscreen.push(view.get('content'));
- onscreenCloaks.push(view);
- }
-
- bottomView++;
- }
- if (bottomView >= childViews.length) { bottomView = childViews.length - 1; }
-
- // If our controller has a `sawObjects` method, pass the on screen objects to it.
- var controller = this.get('controller');
- if (onscreen.length) {
- this.setProperties({topVisible: onscreen[0], bottomVisible: onscreen[onscreen.length-1]});
- if (controller && controller.sawObjects) {
- Em.run.schedule('afterRender', function() {
- controller.sawObjects(onscreen);
- });
- }
- } else {
- this.setProperties({topVisible: null, bottomVisible: null});
- }
-
- var toCloak = childViews.slice(0, topView).concat(childViews.slice(bottomView+1));
-
- this._uncloak = toUncloak;
- if(this._nextUncloak){
- Em.run.cancel(this._nextUncloak);
- this._nextUncloak = null;
- }
-
- Em.run.schedule('afterRender', this, function() {
- onscreenCloaks.forEach(function (v) {
- if(v && v.uncloak) {
- v.uncloak();
- }
- });
- toCloak.forEach(function (v) { v.cloak(); });
- if (self._nextUncloak) { Em.run.cancel(self._nextUncloak); }
- self._nextUncloak = Em.run.later(self, self.uncloakQueue,50);
- });
-
- for (var j=bottomView; j<childViews.length; j++) {
- var checkView = childViews[j];
- if (!checkView._containedView) {
- if (!checkView.get('loading')) {
- checkView.$().html(this.get('loadingHTML') || "Loading...");
- }
- return;
- }
- }
-
- },
-
- uncloakQueue: function(){
- var maxPerRun = 3, delay = 50, processed = 0, self = this;
-
- if(this._uncloak){
- while(processed < maxPerRun && this._uncloak.length>0){
- var view = this._uncloak.shift();
- if(view && view.uncloak && !view._containedView){
- Em.run.schedule('afterRender', view, view.uncloak);
- processed++;
- }
- }
- if(this._uncloak.length === 0){
- this._uncloak = null;
- } else {
- Em.run.schedule('afterRender', self, function(){
- if(self._nextUncloak){
- Em.run.cancel(self._nextUncloak);
- }
- self._nextUncloak = Em.run.next(self, function(){
- if(self._nextUncloak){
- Em.run.cancel(self._nextUncloak);
- }
- self._nextUncloak = Em.run.later(self,self.uncloakQueue,delay);
- });
- });
- }
- }
- },
-
- scrollTriggered: function() {
- Em.run.scheduleOnce('afterRender', this, 'scrolled');
- },
-
- _startEvents: Ember.on('didInsertElement', function() {
- if (this.get('offsetFixed')) {
- Em.warn("Cloaked-collection's `offsetFixed` is deprecated. Use `offsetFixedTop` instead.");
- }
-
- var self = this,
- offsetFixedTop = this.get('offsetFixedTop') || this.get('offsetFixed'),
- offsetFixedBottom = this.get('offsetFixedBottom'),
- onScrollMethod = function() {
- Ember.run.debounce(self, 'scrollTriggered', 10);
- };
-
- if (offsetFixedTop) {
- this.set('offsetFixedTopElement', Ember.$(offsetFixedTop));
- }
-
- if (offsetFixedBottom) {
- this.set('offsetFixedBottomElement', Ember.$(offsetFixedBottom));
- }
-
- Ember.$(document).bind('touchmove.ember-cloak', onScrollMethod);
- Ember.$(window).bind('scroll.ember-cloak', onScrollMethod);
- this.addObserver('wrapperTop', self, onScrollMethod);
- this.addObserver('wrapperHeight', self, onScrollMethod);
- this.addObserver('content.@each', self, onScrollMethod);
- this.scrollTriggered();
-
- this.set('scrollingEnabled', true);
- }),
-
- cleanUp: function() {
- Ember.$(document).unbind('touchmove.ember-cloak');
- Ember.$(window).unbind('scroll.ember-cloak');
- this.set('scrollingEnabled', false);
- },
-
- _endEvents: Ember.on('willDestroyElement', function() {
- this.cleanUp();
- })
- });
-
-
- /**
- A cloaked view is one that removes its content when scrolled off the screen
-
- @class CloakedView
- @extends Ember.View
- @namespace Ember
- **/
- Ember.CloakedView = Ember.View.extend({
- attributeBindings: ['style'],
-
- /**
- Triggers the set up for rendering a view that is cloaked.
-
- @method uncloak
- */
- uncloak: function() {
- var state = this._state || this.state;
- if (state !== 'inDOM' && state !== 'preRender') { return; }
-
- if (!this._containedView) {
- var model = this.get('content'),
- controller = null,
- container = this.get('container');
-
- // Wire up the itemController if necessary
- var controllerName = this.get('cloaksController');
- if (controllerName) {
- var controllerFullName = 'controller:' + controllerName,
- factory = container.lookupFactory(controllerFullName),
- parentController = this.get('controller');
-
- // let ember generate controller if needed
- if (factory === undefined) {
- factory = Ember.generateControllerFactory(container, controllerName, model);
-
- // inform developer about typo
- Ember.Logger.warn('ember-cloaking: can\'t lookup controller by name "' + controllerFullName + '".');
- Ember.Logger.warn('ember-cloaking: using ' + factory.toString() + '.');
- }
-
- controller = factory.create({
- model: model,
- parentController: parentController,
- target: parentController
- });
- }
- var createArgs = {},
- target = controller || model;
-
- if (this.get('preservesContext')) {
- createArgs.content = target;
- } else {
- createArgs.context = target;
- }
- if (controller) { createArgs.controller = controller; }
- this.setProperties({
- style: null,
- loading: false
- });
-
- this._containedView = this.createChildView(this.get('cloaks'), createArgs);
- this.rerender();
- }
- },
-
- /**
- Removes the view from the DOM and tears down all observers.
-
- @method cloak
- */
- cloak: function() {
- var self = this;
-
- if (this._containedView && (this._state || this.state) === 'inDOM') {
- var style = 'height: ' + this.$().height() + 'px;';
- this.set('style', style);
- this.$().prop('style', style);
-
- // We need to remove the container after the height of the element has taken
- // effect.
- Ember.run.schedule('afterRender', function() {
- if(self._containedView){
- self._containedView.remove();
- self._containedView = null;
- }
- });
- }
- },
-
- _removeContainedView: Ember.on('willDestroyElement', function(){
- if(this._containedView){
- this._containedView.remove();
- this._containedView = null;
- }
- this._super();
- }),
-
- _setHeights: Ember.on('didInsertElement', function(){
- if (!this._containedView) {
- // setting default height
- // but do not touch if height already defined
- if(!this.$().height()){
- var defaultHeight = 100;
- if(this.get('defaultHeight')) {
- defaultHeight = this.get('defaultHeight');
- }
-
- this.$().css('height', defaultHeight);
- }
- }
- }),
-
- /**
- Render the cloaked view if applicable.
-
- @method render
- */
- render: function(buffer) {
- var containedView = this._containedView, self = this;
-
- if (containedView && (containedView._state || containedView.state) !== 'inDOM') {
- containedView.triggerRecursively('willInsertElement');
- containedView.renderToBuffer(buffer);
- containedView._transitionTo('inDOM');
- Em.run.schedule('afterRender', function() {
- if(self._containedView) {
- self._containedView.triggerRecursively('didInsertElement');
- }
- });
- }
- }
-
- });
-
-
-
- Ember.Handlebars.registerHelper('cloaked-collection', function(options) {
- var hash = options.hash,
- types = options.hashTypes;
-
- for (var prop in hash) {
- if (types[prop] === 'ID') {
- hash[prop + 'Binding'] = hash[prop];
- delete hash[prop];
- }
- }
- return Ember.Handlebars.helpers.view.call(this, Ember.CloakedCollectionView, options);
- });
-
-})();
[05/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/context-row-menu.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/context-row-menu.js b/contrib/views/files/src/main/resources/ui/app/components/context-row-menu.js
new file mode 100644
index 0000000..1e9551b
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/context-row-menu.js
@@ -0,0 +1,137 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+ fileSelectionService: Ember.inject.service('files-selection'),
+ modalEventBus: Ember.inject.service('modal-event-bus'),
+ alertMessages: Ember.inject.service('alert-messages'),
+ filesDownloadService: Ember.inject.service('files-download'),
+
+ classNames: ['row', 'context-menu-row'],
+ selectedFilesCount: Ember.computed.oneWay('fileSelectionService.filesCount'),
+ selectedFolderCount: Ember.computed.oneWay('fileSelectionService.folderCount'),
+ isMultiSelected: Ember.computed('selectedFilesCount', 'selectedFolderCount', function() {
+ return this.get('selectedFilesCount') + this.get('selectedFolderCount') > 1;
+ }),
+ isSingleSelected: Ember.computed('selectedFilesCount', 'selectedFolderCount', function() {
+ return this.get('selectedFilesCount') + this.get('selectedFolderCount') === 1;
+ }),
+ isSelected: Ember.computed('selectedFilesCount', 'selectedFolderCount', function() {
+ return (this.get('selectedFilesCount') + this.get('selectedFolderCount')) !== 0;
+ }),
+ isOnlyMultiFilesSelected: Ember.computed('selectedFilesCount', 'selectedFolderCount', function() {
+ return this.get('selectedFolderCount') === 0 && this.get('selectedFilesCount') > 1;
+ }),
+
+ didInitAttrs: function() {
+ // Register different modal so that they can be controlled from outside
+ this.get('modalEventBus').registerModal('ctx-open');
+ this.get('modalEventBus').registerModal('ctx-rename');
+ this.get('modalEventBus').registerModal('ctx-permission');
+ this.get('modalEventBus').registerModal('ctx-delete');
+ this.get('modalEventBus').registerModal('ctx-copy');
+ this.get('modalEventBus').registerModal('ctx-move');
+ this.get('modalEventBus').registerModal('ctx-download');
+ this.get('modalEventBus').registerModal('ctx-concatenate');
+ },
+
+ willDestroyElement() {
+ this.get('modalEventBus').resetModal('ctx-open');
+ this.get('modalEventBus').resetModal('ctx-rename');
+ this.get('modalEventBus').resetModal('ctx-permission');
+ this.get('modalEventBus').resetModal('ctx-delete');
+ this.get('modalEventBus').resetModal('ctx-copy');
+ this.get('modalEventBus').resetModal('ctx-move');
+ this.get('modalEventBus').resetModal('ctx-download');
+ this.get('modalEventBus').resetModal('ctx-concatenate');
+ },
+
+ actions: {
+ open: function(event) {
+ if (this.get('isSingleSelected')) {
+ var file = this.get('fileSelectionService.files').objectAt(0);
+ if (file.get('isDirectory')) {
+ this.sendAction('openFolderAction', file.get('path'));
+ } else {
+ this.get('modalEventBus').showModal('ctx-open');
+ }
+ }
+
+ },
+
+ delete: function(event) {
+ if (!this.get('isSelected')) {
+ return false;
+ }
+ this.get('modalEventBus').showModal('ctx-delete');
+ },
+
+ copy: function(event) {
+ if (!this.get('isSelected')) {
+ return false;
+ }
+ this.get('modalEventBus').showModal('ctx-copy');
+ },
+
+ move: function(event) {
+ if (!this.get('isSelected')) {
+ return false;
+ }
+ this.get('modalEventBus').showModal('ctx-move');
+ },
+
+ download: function(event) {
+ if (!this.get('isSelected')) {
+ return false;
+ }
+ this.get('filesDownloadService').download();
+ },
+
+ concatenate: function(event) {
+ if (!this.get('isOnlyMultiFilesSelected')) {
+ return false;
+ }
+ this.get('filesDownloadService').concatenate();
+ },
+
+ rename: function(event) {
+ if (!this.get('isSingleSelected')) {
+ return false;
+ }
+ this.get('modalEventBus').showModal('ctx-rename');
+ },
+ permission: function(event) {
+ if (!this.get('isSingleSelected')) {
+ return false;
+ }
+ this.get('modalEventBus').showModal('ctx-permission');
+ },
+
+ modalClosed: function(modalName) {
+ this.get('modalEventBus').resetModal(modalName);
+ },
+
+ refreshCurrentRoute: function() {
+ this.get('fileSelectionService').reset();
+ this.sendAction('refreshCurrentRouteAction');
+ }
+ }
+
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/contextMenu.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/contextMenu.js b/contrib/views/files/src/main/resources/ui/app/components/contextMenu.js
deleted file mode 100644
index 0c715dc..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/contextMenu.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.ContextMenuComponent = Em.Component.extend({
- layoutName:'components/contextMenu',
-
- onTargetChange:function () {
- this.$().off('hidden.bs.context');
- this.$().on('hidden.bs.context', Em.run.bind(this, this.resetConfirmations));
- }.observes('target'),
-
- resetConfirmations:function () {
- this.triggerRecursively('resetConfirm');
- },
-
- actions:{
- removeFile:function () {
- this.get('target').send('deleteFile',true);
- },
- moveToTrash:function () {
- this.get('target').send('deleteFile');
- }
- }
-
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/copy-modal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/copy-modal.js b/contrib/views/files/src/main/resources/ui/app/components/copy-modal.js
new file mode 100644
index 0000000..79a78ec
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/copy-modal.js
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import OperationModal from '../mixins/operation-modal';
+
+export default Ember.Component.extend(OperationModal, {
+ closeOnEscape: true,
+ fileSelectionService: Ember.inject.service('files-selection'),
+ fileOperationService: Ember.inject.service('file-operation'),
+ selectedFiles: Ember.computed.alias('fileSelectionService.files'),
+ selected: Ember.computed('selectedFiles', function () {
+ return this.get('selectedFiles').objectAt(0);
+ }),
+ selectionName: '/',
+ isUpdating: false,
+ browseError: false,
+ browseErrorMessege: '',
+ hasError: false,
+ shouldRetry: false,
+ currentFailedPath: '',
+ currentUnprocessedPaths: [],
+ currentFailureMessage: '',
+
+ copyPaths: function (paths, destination) {
+ this.set('isUpdating', true);
+
+ this.get('fileOperationService').copyPaths(paths, destination).then(
+ (response) => {
+ this.set('isUpdating', false);
+ this.send('close');
+ this.sendAction('refreshAction');
+ }, (error) => {
+ this.set('isUpdating', false);
+ if (error.unprocessable === true) {
+ this.set('hasError', true);
+ this.set('currentFailedPath', error.failed);
+ this.set('currentFailureMessage', error.message);
+ this.set('shouldRetry', error.retry);
+ this.set('currentUnprocessedPaths', error.unprocessed);
+ } else {
+ this.set('isUpdating', false);
+ this.get('logger').danger("Failed to delete files and folders.", error);
+ this.send('close');
+ }
+ });
+ },
+ reset: function () {
+ this.set('browseError', false);
+ this.set('browseErrorMessege', '');
+ this.set('selectionName', '/');
+ this.set('hasError', false);
+ this.set('shouldRetry', false);
+ this.set('isUpdating', false);
+ this.set('currentFailedPath', '');
+ this.set('currentFailureMessage', '');
+ this.set('currentUnprocessedPaths', '');
+ },
+ actions: {
+
+ didOpenModal: function () {
+ this.reset();
+ console.log("Move modal opened");
+ },
+
+ didCloseModal: function () {
+ console.log("Move Modal did close.");
+ },
+
+ copy: function () {
+ var currentPathsToMove = this.get('selectedFiles').map((entry) => {
+ return entry.get('path')
+ });
+ var destinationPath = (this.get('selectionName') !== '') ? this.get('selectionName') : '/';
+ this.copyPaths(currentPathsToMove, destinationPath);
+ },
+
+ retryError: function () {
+ var newPaths = [this.get('currentFailedPath')];
+ if (Ember.isArray(this.get('currentUnprocessedPaths'))) {
+ newPaths.pushObjects(this.get('currentUnprocessedPaths'));
+ }
+ var destinationPath = (this.get('selectionName') !== '') ? this.get('selectionName') : '/';
+ this.copyPaths(newPaths, destinationPath);
+ },
+
+ skipAndRetry: function () {
+ var destinationPath = (this.get('selectionName') !== '') ? this.get('selectionName') : '/';
+ this.copyPaths(this.get('currentUnprocessedPaths'), destinationPath);
+ },
+
+ skipAll: function () {
+ this.send('close');
+ this.sendAction('refreshAction');
+ },
+
+ pathSelected: function (path) {
+ console.log(path);
+ this.set('selectionName', path);
+ this.set('browseError', false);
+
+ },
+
+ browseError: function (error) {
+ this.set('browseError', true);
+ this.set('browseErrorMessage', error.message);
+ }
+ }
+
+
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/delete-modal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/delete-modal.js b/contrib/views/files/src/main/resources/ui/app/components/delete-modal.js
new file mode 100644
index 0000000..cb71ba7
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/delete-modal.js
@@ -0,0 +1,130 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import OperationModal from '../mixins/operation-modal';
+
+export default Ember.Component.extend(OperationModal, {
+ fileSelectionService: Ember.inject.service('files-selection'),
+ fileOperationService: Ember.inject.service('file-operation'),
+ logger: Ember.inject.service('alert-messages'),
+ closeOnEscape: true,
+ deletePermanently: false,
+ deletePermanentlyAlways: false,
+ showDeletePermanentCheckbox: true,
+ selectedFiles: Ember.computed.alias('fileSelectionService.files'),
+ filesCount: Ember.computed.oneWay('fileSelectionService.filesCount'),
+ folderCount: Ember.computed.oneWay('fileSelectionService.folderCount'),
+ hasFiles: Ember.computed('filesCount', function() {
+ return this.get('filesCount') > 0;
+ }),
+ hasFolders: Ember.computed('folderCount', function() {
+ return this.get('folderCount') > 0;
+ }),
+ hasError: false,
+ shouldRetry: false,
+ currentFailedPath: '',
+ currentUnprocessedPaths: [],
+ currentFailureMessage: '',
+ currentServerFailureMessage: '',
+ isDeleting: false,
+
+ setTrashSettings: Ember.on('init', Ember.observer('currentPathIsTrash', function() {
+ if(this.get('currentPathIsTrash')) {
+ this.set('deletePermanentlyAlways', true);
+ this.set('showDeletePermanentCheckbox', false);
+ } else {
+ this.set('deletePermanentlyAlways', false);
+ this.set('showDeletePermanentCheckbox', true);
+ }
+
+ })),
+
+ disableCloseOnEscape: Ember.observer('isDeleting', function() {
+ if (this.get('isDeleting') === true) {
+ this.set('closeOnEscape', false);
+ } else {
+ this.set('closeOnEscape', true);
+ }
+ }),
+
+ deletePaths: function(paths) {
+ this.set('isDeleting', true);
+ let deletePermanently = this.get('deletePermanently');
+ if(this.get('deletePermanentlyAlways')) {
+ deletePermanently = true;
+ }
+ this.get('fileOperationService').deletePaths(paths, deletePermanently).then(
+ (response) => {
+ this.set('isDeleting', false);
+ this.send('close');
+ this.sendAction('refreshAction');
+ }, (error) => {
+ this.set('isDeleting', false);
+ if (error.unprocessable === true) {
+ this.set('hasError', true);
+ this.set('currentFailedPath', error.failed);
+ this.set('currentServerFailureMessage', error.message);
+ this.set('currentFailureMessage', `Failed to delete <strong>${error.failed}</strong>.`);
+ this.set('shouldRetry', error.retry);
+ this.set('currentUnprocessedPaths', error.unprocessed);
+ } else {
+ this.set('isDeleting', false);
+ this.get('logger').danger("Failed to delete files and folders.", error);
+ this.send('close');
+ }
+ });
+ },
+ reset: function() {
+ this.set('deletePermanently', false);
+ this.set('hasError', false);
+ this.set('shouldRetry', false);
+ this.set('isDeleting', false);
+ this.set('currentFailedPath', '');
+ this.set('currentFailureMessage', '');
+ this.set('currentUnprocessedPaths', '');
+ },
+ actions: {
+ didOpenModal: function() {
+ this.reset();
+ console.log("Delete modal opened");
+ },
+
+ didCloseModal: function() {
+ console.log("Delete Modal closed");
+ },
+ delete: function() {
+ var currentPathsToDelete = this.get('selectedFiles').map((entry) => { return entry.get('path');});
+ this.deletePaths(currentPathsToDelete);
+ },
+ retryError: function() {
+ var newPaths = [this.get('currentFailedPath')];
+ if (Ember.isArray(this.get('currentUnprocessedPaths'))) {
+ newPaths.pushObjects(this.get('currentUnprocessedPaths'));
+ }
+ this.deletePaths(newPaths);
+ },
+ skipAndRetry: function() {
+ this.deletePaths(this.get('currentUnprocessedPaths'));
+ },
+ skipAll: function() {
+ this.send('close');
+ this.sendAction('refreshAction');
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/directory-viewer.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/directory-viewer.js b/contrib/views/files/src/main/resources/ui/app/components/directory-viewer.js
new file mode 100644
index 0000000..69e725b
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/directory-viewer.js
@@ -0,0 +1,165 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FileOperationMixin from '../mixins/file-operation';
+
+export default Ember.Component.extend(FileOperationMixin, {
+ fileOperationService: Ember.inject.service('file-operation'),
+ classNames: ['directory-viewer'],
+ startPath: '/',
+ treeData: Ember.A(),
+ currentPath: Ember.computed.oneWay('startPath'),
+ currentQueryParam: Ember.computed('currentPath', function() {
+ return Ember.$.param({path: this.get('currentPath')});
+ }),
+
+ startFetch: Ember.on('didInitAttrs', function() {
+ this.fetchData();
+ }),
+
+ fetchData: function() {
+ this.get('fileOperationService').listPath(this.get('currentQueryParam')).then(
+ (response) => {
+ this.modifyTreeViewData(response);
+ }, (error) => {
+ this.sendAction('errorAction', error);
+ }
+ )
+ },
+
+ modifyTreeViewData: function(response) {
+
+ let paths = response.map((entry) => {
+ return {
+ path: entry.path,
+ pathSegment: this.getNameForPath(entry.path),
+ text: this.getNameForPath(entry.path),
+ nodes: Ember.A()
+ };
+ });
+
+ var currentPath = this.get('currentPath');
+ var newTreeData = Ember.copy(this.get('treeData'), true);
+ if(currentPath === '/') {
+ newTreeData = paths;
+ } else {
+ this.insertPathToTreeData(newTreeData, paths, currentPath.substring(1));
+ }
+
+ this.set('treeData', newTreeData);
+ this.send('refreshTreeView');
+ },
+
+ insertPathToTreeData(treeData, paths, pathSegment) {
+ let firstPathSegment;
+ if (pathSegment.indexOf('/') !== -1) {
+ firstPathSegment = pathSegment.substring(0, pathSegment.indexOf('/'));
+ } else {
+ firstPathSegment = pathSegment;
+ }
+
+ if(treeData.length === 0) {
+ treeData.pushObjects(paths);
+ } else {
+ treeData.forEach((entry) => {
+ entry.state = {};
+ if (entry.pathSegment === firstPathSegment) {
+ entry.state.expanded = true;
+ if(entry.nodes.length === 0) {
+ entry.nodes.pushObjects(paths);
+ } else {
+ this.insertPathToTreeData(entry.nodes, paths, pathSegment.substring(pathSegment.indexOf('/') + 1));
+ }
+ } else {
+ this.collapseAll(entry);
+ }
+ });
+ }
+ },
+
+ collapseAll: function(node) {
+ if (Ember.isNone(node.state)) {
+ node.state = {};
+ }
+ node.state.expanded = false;
+ node.nodes.forEach((entry) => {
+ this.collapseAll(entry);
+ });
+
+ },
+
+ getNameForPath: function(path) {
+ return path.substring(path.lastIndexOf("/") + 1);
+ },
+
+ collapseAllExceptPath: function(pathSegment) {
+ let collapseAll = function(nodes, pathSegment) {
+ var firstPathSegment;
+ if (pathSegment.indexOf('/') !== -1) {
+ firstPathSegment = pathSegment.substring(0, pathSegment.indexOf('/'));
+ } else {
+ firstPathSegment = pathSegment;
+ }
+
+ nodes.forEach((entry) => {
+ if (Ember.isNone(entry.state)) {
+ entry.state = {};
+ }
+ if(firstPathSegment !== entry.pathSegment) {
+ entry.state.expanded = false;
+ } else {
+ entry.state.expanded = true;
+ collapseAll(entry.nodes, pathSegment.substring(pathSegment.indexOf('/') + 1));
+ }
+ });
+ };
+ var newTreeData = this.get('treeData');
+ collapseAll(newTreeData, pathSegment);
+ this.set('treeData', newTreeData);
+ this.send('refreshTreeView');
+ },
+
+ actions: {
+ refreshTreeView() {
+ Ember.run.later(() => {
+ this.$().treeview({
+ data: this.get('treeData'),
+ expandIcon: "fa fa-folder",
+ collapseIcon: "fa fa-folder-open",
+ emptyIcon: "fa fa-folder-open-o",
+ showBorder: false,
+ onNodeSelected: (event, data) => {
+ this.set('currentPath', data.path);
+ this.sendAction('pathSelectAction', data.path);
+ },
+ onNodeExpanded: (event, data) => {
+ this.set('currentPath', data.path);
+ if (!Ember.isNone(data.nodes) && data.nodes.length === 0) {
+ var node = this.$().treeview('getNode', data.nodeId);
+ node.icon = "fa fa-refresh fa-spin";
+ this.fetchData();
+ } else {
+ this.collapseAllExceptPath(data.path.substring(1));
+ }
+ }
+ });
+ });
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/file-row.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/file-row.js b/contrib/views/files/src/main/resources/ui/app/components/file-row.js
new file mode 100644
index 0000000..a7fdbee
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/file-row.js
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+ classNames: ['col-md-12', 'file-row'],
+ classNameBindings: ['isSelected:row-selected'],
+ isSelected: Ember.computed.alias('file.isSelected'),
+
+ click: function(event) {
+ if(event.shiftKey) {
+ this.sendAction("multiSelectAction", this.get('file'), true);
+ } else if (event.ctrlKey) {
+ this.sendAction("multiSelectAction", this.get('file'), false);
+ } else if (event.metaKey) {
+ this.sendAction("multiSelectAction", this.get('file'), false);
+ } else {
+ this.sendAction("singleSelectAction", this.get('file'));
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/file-search.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/file-search.js b/contrib/views/files/src/main/resources/ui/app/components/file-search.js
new file mode 100644
index 0000000..b65749c
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/file-search.js
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+ classNames: ['input-group'],
+ classNameBindings: ['expanded::col-md-9', 'expanded::col-md-offset-3'],
+ expanded: false,
+
+ searchText: '',
+
+ throttleTyping: Ember.observer('searchText', function() {
+ Ember.run.debounce(this, this.searchFiles, 500);
+ }),
+
+ searchFiles: function() {
+ this.sendAction('searchAction', this.get('searchText'));
+ },
+
+ focusIn: function() {
+ this.set('expanded', true);
+ },
+ focusOut: function() {
+ this.set('expanded', false);
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/files-breadcrumb.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/files-breadcrumb.js b/contrib/views/files/src/main/resources/ui/app/components/files-breadcrumb.js
new file mode 100644
index 0000000..be3054c
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/files-breadcrumb.js
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+ path: '',
+ collapseAt: 4,
+ tagName: 'ul',
+ classNames: ['breadcrumb'],
+ collapsingRequired: false,
+ collapsedCrumbs: [],
+ expandedCrumbs: [],
+
+ crumbs: Ember.on('init', Ember.observer('path', function() {
+ var path = this.get('path');
+ var currentPath = path.split('/').filter((entry) => { return !Ember.isBlank(entry) });
+ currentPath.unshift("/");
+ var that = this;
+ var shouldCollapse = function(scope, array, index) {
+ return (((array.length - 1) >= scope.get('collapseAt')) && (index < array.length - 2));
+ };
+ var getCrumb = function(index, allCrumbs) {
+ return {name: allCrumbs[index], path: "/" + allCrumbs.slice(1, index + 1).join('/'), last: false};
+ };
+
+ var collapsedCrumbs = currentPath.map(function(curr, i, array) {
+ if(shouldCollapse(that, array, i)) {
+ return getCrumb(i, array);
+ } else {
+ return {};
+ }
+ }).filterBy('name');
+
+ var crumbs = currentPath.map(function(curr, i, array) {
+ if(!shouldCollapse(that, array, i)) {
+ return getCrumb(i, array);
+ } else {
+ return {};
+ }
+ }).filterBy('name');
+
+ crumbs.set('lastObject.last', true);
+
+ if (collapsedCrumbs.length > 0) {
+ this.set('collapsingRequired', true);
+ } else {
+ this.set('collapsingRequired', false);
+ }
+ this.set('collapsedCrumbs', collapsedCrumbs.reverse());
+ this.set('expandedCrumbs', crumbs);
+ }))
+
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/files-collection.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/files-collection.js b/contrib/views/files/src/main/resources/ui/app/components/files-collection.js
new file mode 100644
index 0000000..43ef243
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/files-collection.js
@@ -0,0 +1,98 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import { EKMixin, keyUp } from 'ember-keyboard';
+
+export default Ember.Component.extend(EKMixin, {
+ minHeight: 600,
+ currentWidth: 1000,
+ currentHeight: 600,
+ columnsConfig: [],
+ sortOptions: [-1, 0, 1],
+ parentPath: '',
+ isEmptyParentPath: Ember.computed('parentPath', function() {
+ return Ember.isBlank(this.get('parentPath'));
+ }),
+
+ resizeView: Ember.on('init', function() {
+ $(window).resize(this.windowResized(this));
+ }),
+
+ destroyResizeView: Ember.on('willDestroyElement', function() {
+ $(window).off("resize");
+ }),
+
+ activateKeyboard: Ember.on('init', function() {
+ this.set('keyboardActivated', true);
+ }),
+
+ resetAllSelection: Ember.on(keyUp('Escape'), function() {
+ this.sendAction('resetSelection');
+ }),
+
+ selectAll: Ember.on(keyUp('shift+s'), function() {
+ this.sendAction('selectAllAction', false);
+ }),
+
+ containerStyle: Ember.computed('currentHeight', function() {
+ var height = this.get('currentHeight');
+ var style = 'position: relative; height: ' + height + 'px';
+ return style.htmlSafe();
+ }),
+
+ windowResized: function(scope) {
+ return function() {
+ Ember.run.later(function() {
+ var currentWidth = $("#" + scope.get('containerId')).width();
+ var windowHeight = $(window).height();
+ var relativeHeight = windowHeight - 220;
+ if(relativeHeight < scope.get('minHeight')) {
+ relativeHeight = scope.get('minHeight');
+ }
+ scope.set('currentWidth', currentWidth);
+ scope.set('currentHeight', relativeHeight);
+ });
+ };
+ },
+
+ didInsertElement: function() {
+ var func = this.windowResized(this);
+ func();
+ },
+
+ actions: {
+ rotateSort: function(column) {
+ if(!column['sortable'] || this.get('sortEnabled') !== true) {
+ return false;
+ }
+ var sortOptions = this.get('sortOptions');
+ // Resetting the current sort order
+ this.get('columnsConfig').forEach(function(entry) {
+ if(entry['key'] !== column['key']) {
+ Ember.set(entry, 'sortOrder', sortOptions[1]);
+ }
+ });
+ var currentSortOrder = column['sortOrder'];
+ var currentSortOrderIndex = sortOptions.indexOf(currentSortOrder);
+ var nextSortOrderIndex = (currentSortOrderIndex + 1) % sortOptions.length;
+ Ember.set(column, 'sortOrder', sortOptions[nextSortOrderIndex]);
+ this.sendAction('sortAction', column);
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/mkdirInput.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/mkdirInput.js b/contrib/views/files/src/main/resources/ui/app/components/mkdirInput.js
deleted file mode 100644
index d98a429..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/mkdirInput.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.MkdirInputComponent = Em.Component.extend({
- layoutName:'components/mkdirInput',
- newDirName:'',
- isMkdir:false,
- path:'',
- actions:{
- create:function () {
- var name = this.get('newDirName');
-
- if (Em.isEmpty(name)) {
- return false;
- }
- newDir = [this.get('path'),name].join('/').replace('//','/');
-
- this.sendAction('create',newDir);
- this.setProperties({'newDirName':'','isMkdir':false});
- },
- edit:function () {
- this.set('isMkdir',true);
- },
- cancel:function () {
- this.setProperties({'newDirName':'','isMkdir':false});
- }
- },
- focusOnInput: function () {
- Em.run.next(this,function() {
- this.$('.mkdir-input').focus();
- });
- }.observes('isMkdir'),
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/move-modal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/move-modal.js b/contrib/views/files/src/main/resources/ui/app/components/move-modal.js
new file mode 100644
index 0000000..41de5f3
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/move-modal.js
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import OperationModal from '../mixins/operation-modal';
+
+export default Ember.Component.extend(OperationModal, {
+ closeOnEscape: true,
+ fileSelectionService: Ember.inject.service('files-selection'),
+ fileOperationService: Ember.inject.service('file-operation'),
+ selectedFiles: Ember.computed.alias('fileSelectionService.files'),
+ selected: Ember.computed('selectedFiles', function () {
+ return this.get('selectedFiles').objectAt(0);
+ }),
+ selectionName: '/',
+ isUpdating: false,
+ browseError: false,
+ browseErrorMessege: '',
+ hasError: false,
+ shouldRetry: false,
+ currentFailedPath: '',
+ currentUnprocessedPaths: [],
+ currentFailureMessage: '',
+
+ movePaths: function (paths, destination) {
+ this.set('isUpdating', true);
+
+ this.get('fileOperationService').movePaths(paths, destination).then(
+ (response) => {
+ this.set('isUpdating', false);
+ this.send('close');
+ this.sendAction('refreshAction');
+ }, (error) => {
+ this.set('isUpdating', false);
+ if (error.unprocessable === true) {
+ this.set('hasError', true);
+ this.set('currentFailedPath', error.failed);
+ this.set('currentFailureMessage', error.message);
+ this.set('shouldRetry', error.retry);
+ this.set('currentUnprocessedPaths', error.unprocessed);
+ } else {
+ this.set('isUpdating', false);
+ this.get('logger').danger("Failed to delete files and folders.", error);
+ this.send('close');
+ }
+ });
+ },
+ reset: function () {
+ this.set('browseError', false);
+ this.set('browseErrorMessege', '');
+ this.set('selectionName', '/');
+ this.set('hasError', false);
+ this.set('shouldRetry', false);
+ this.set('isUpdating', false);
+ this.set('currentFailedPath', '');
+ this.set('currentFailureMessage', '');
+ this.set('currentUnprocessedPaths', '');
+ },
+ actions: {
+
+ didOpenModal: function () {
+ this.reset();
+ console.log("Move modal opened");
+ },
+
+ didCloseModal: function () {
+ console.log("Move Modal did close.");
+ },
+
+ move: function () {
+ var currentPathsToMove = this.get('selectedFiles').map((entry) => {
+ return entry.get('path')
+ });
+ var destinationPath = (this.get('selectionName') !== '') ? this.get('selectionName') : '/';
+ this.movePaths(currentPathsToMove, destinationPath);
+ },
+
+ retryError: function () {
+ var newPaths = [this.get('currentFailedPath')];
+ if (Ember.isArray(this.get('currentUnprocessedPaths'))) {
+ newPaths.pushObjects(this.get('currentUnprocessedPaths'));
+ }
+ var destinationPath = (this.get('selectionName') !== '') ? this.get('selectionName') : '/';
+ this.movePaths(newPaths, destinationPath);
+ },
+
+ skipAndRetry: function () {
+ var destinationPath = (this.get('selectionName') !== '') ? this.get('selectionName') : '/';
+ this.movePaths(this.get('currentUnprocessedPaths'), destinationPath);
+ },
+
+ skipAll: function () {
+ this.send('close');
+ this.sendAction('refreshAction');
+ },
+
+ pathSelected: function (path) {
+ console.log(path);
+ this.set('selectionName', path);
+ this.set('browseError', false);
+
+ },
+
+ browseError: function (error) {
+ this.set('browseError', true);
+ this.set('browseErrorMessage', error.message);
+ }
+ }
+
+
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/new-directory.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/new-directory.js b/contrib/views/files/src/main/resources/ui/app/components/new-directory.js
new file mode 100644
index 0000000..c30cc8c
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/new-directory.js
@@ -0,0 +1,75 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import OperationModal from '../mixins/operation-modal';
+
+export default Ember.Component.extend(OperationModal, {
+ modalEventBus: Ember.inject.service('modal-event-bus'),
+ fileOperationService: Ember.inject.service('file-operation'),
+ closeOnEscape: true,
+ tagName: 'span',
+ name: 'ctx-new-directory',
+ hasError: false,
+ errorMessage: '',
+ folderName: '',
+ didInitAttrs: function() {
+ this.get('modalEventBus').registerModal("ctx-new-directory");
+ },
+ willDestroyElement() {
+ this.get('modalEventBus').resetModal("ctx-new-directory");
+ },
+ resetError: Ember.observer('folderName', function() {
+ this.set('hasError', false);
+ this.set('errorMessage', '');
+ }),
+ setError: function(message) {
+ this.set('hasError', true);
+ this.set('errorMessage', message);
+ },
+ actions: {
+ didOpenModal: function() {
+ this.set('folderName');
+ Ember.run.later(() => {
+ this.$('input').focus();
+ }, 500);
+ },
+ create: function() {
+ if(Ember.isBlank(this.get('folderName'))) {
+ this.setError('Cannot be empty');
+ return false;
+ }
+
+ if(this.get('fileOperationService').isExistsInCurrentPath(this.get('folderName'))) {
+ this.setError('Name already exists');
+ return false;
+ }
+
+ this.get('fileOperationService').createNewFolder(this.get('path'), this.get('folderName')).then(
+ (response) => {
+ this.send('close');
+ this.sendAction('refreshAction');
+ }, (error) => {
+ this.send('close');
+ });
+ },
+ openModal : function() {
+ this.get('modalEventBus').showModal('ctx-new-directory');
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/open-preview-modal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/open-preview-modal.js b/contrib/views/files/src/main/resources/ui/app/components/open-preview-modal.js
new file mode 100644
index 0000000..bc60227
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/open-preview-modal.js
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import OperationModal from '../mixins/operation-modal';
+
+export default Ember.Component.extend(OperationModal, {
+ closeOnEscape: true,
+ filePreviewService: Ember.inject.service('file-preview'),
+ selectedFilePath: '',
+ modalGuardChanged: Ember.observer('modalGuard', function () {
+ if (this.get('modalGuard')) {
+ console.log("Modal Guard set");
+ } else {
+ console.log("Modal Guard not set");
+ }
+ }),
+
+ actions: {
+ // Actions to preview modal HTML.
+ didOpenModal: function () {
+ this.set('selectedFilePath', this.get('filePreviewService.selectedFilePath'));
+ this.get('filePreviewService').getNextContent();
+ var _self = this;
+ this.$('.preview-content').on('scroll', function () {
+ if (Ember.$(this).scrollTop() + Ember.$(this).innerHeight() >= this.scrollHeight) {
+ _self.get('filePreviewService').getNextContent();
+ }
+ });
+ },
+ didCloseModal: function () {
+ this.$('.preview-content').off('scroll');
+ this.get('filePreviewService').reset();
+ },
+ download: function () {
+ this.get('filePreviewService').download();
+ }
+ }
+
+});
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/permission-modal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/permission-modal.js b/contrib/views/files/src/main/resources/ui/app/components/permission-modal.js
new file mode 100644
index 0000000..706e839
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/permission-modal.js
@@ -0,0 +1,116 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import OperationModal from '../mixins/operation-modal';
+
+export default Ember.Component.extend(OperationModal, {
+ fileSelectionService: Ember.inject.service('files-selection'),
+ fileOperationService: Ember.inject.service('file-operation'),
+ closeOnEscape: true,
+ isUpdating: false,
+ selected: Ember.computed('fileSelectionService.files', function() {
+ return this.get('fileSelectionService.files').objectAt(0);
+ }),
+ permission: Ember.computed('selected.permission', function() {
+ return this.get('selected.permission');
+ }),
+ setPermissionGuards: function() {
+ var permission = this.get('permission');
+ this.set('usrR', this.isSet(permission, 'user', "read"));
+ this.set('usrW', this.isSet(permission, 'user', "write"));
+ this.set('usrE', this.isSet(permission, 'user', "execute"));
+
+ this.set('grpR', this.isSet(permission, 'group', "read"));
+ this.set('grpW', this.isSet(permission, 'group', "write"));
+ this.set('grpE', this.isSet(permission, 'group', "execute"));
+
+ this.set('othR', this.isSet(permission, 'other', "read"));
+ this.set('othW', this.isSet(permission, 'other', "write"));
+ this.set('othE', this.isSet(permission, 'other', "execute"));
+ },
+
+ isSet: function(permission, userType, permissionType) {
+ var checkValueAtLocation = function(index, value) {
+ return permission[index] === value;
+ };
+
+ var checkValueForPermissionType = function(startIndex, permissionType) {
+ switch(permissionType) {
+ case 'read':
+ return checkValueAtLocation(startIndex, 'r');
+ case 'write':
+ return checkValueAtLocation(startIndex + 1, 'w');
+ case 'execute':
+ return checkValueAtLocation(startIndex + 2, 'x');
+ }
+ };
+ switch(userType) {
+ case "user":
+ return checkValueForPermissionType(1, permissionType);
+ case "group":
+ return checkValueForPermissionType(4, permissionType);
+ case "other":
+ return checkValueForPermissionType(7, permissionType);
+ }
+ },
+
+ getPermissionFromGuards: function() {
+ var oldPermission = this.get('permission');
+ var replaceAt = function(index, value) {
+ return oldPermission.substring(0, index) + value + oldPermission.substring(index + value.length);
+ };
+ oldPermission = this.get('usrR') ? replaceAt(1, 'r') : replaceAt(1, '-');
+ oldPermission = this.get('usrW') ? replaceAt(2, 'w') : replaceAt(2, '-');
+ oldPermission = this.get('usrE') ? replaceAt(3, 'x') : replaceAt(3, '-');
+ oldPermission = this.get('grpR') ? replaceAt(4, 'r') : replaceAt(4, '-');
+ oldPermission = this.get('grpW') ? replaceAt(5, 'w') : replaceAt(5, '-');
+ oldPermission = this.get('grpE') ? replaceAt(6, 'x') : replaceAt(6, '-');
+ oldPermission = this.get('othR') ? replaceAt(7, 'r') : replaceAt(7, '-');
+ oldPermission = this.get('othW') ? replaceAt(8, 'w') : replaceAt(8, '-');
+ oldPermission = this.get('othE') ? replaceAt(9, 'x') : replaceAt(9, '-');
+ return oldPermission;
+ },
+ actions: {
+ didOpenModal: function() {
+ this.setPermissionGuards();
+ },
+
+ chmod: function() {
+ var newPermission = this.getPermissionFromGuards();
+ if(newPermission === this.get('permission')) {
+ return false;
+ }
+ this.set('isUpdating', true);
+ this.get('fileOperationService').chmod(this.get('selected').get('path'), newPermission).then((response) => {
+ this.get('selected').set('permission', response.permission);
+ this.set('isUpdating', false);
+ this.send('close');
+ }, (error) => {
+ this.set('isUpdating', false);
+ this.send('close');
+ });
+ },
+
+ togglePermission: function(propertyName) {
+ Ember.run.later(() => {
+ this.set(propertyName, !this.get(propertyName));
+ });
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/popoverDelete.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/popoverDelete.js b/contrib/views/files/src/main/resources/ui/app/components/popoverDelete.js
deleted file mode 100644
index 2bd6fba..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/popoverDelete.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-Em.BsPopoverComponent.reopen({
- willClearRender:function () {
- var triggers = this.triggers.split(' ');
-
- for (var i = triggers.length; i--;) {
- var trigger = triggers[i];
-
- if (trigger == 'click') {
- this.$element.off('click');
- } else if (trigger != 'manual') {
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focus';
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur';
-
- this.$element.off(eventIn);
- this.$element.off(eventOut);
- }
- }
- }
-});
-
-App.PopoverDeleteComponent = Em.Component.extend({
- popover:Em.computed.alias('childViews.firstObject'),
- layoutName:'components/deletePopover',
- deleteForever:false,
- actions:{
- confirm:function (deleteForever) {
- this.sendAction('confirm',this.get('deleteForever'));
- },
- close:function () {
- this.set('popover.isVisible',false);
- }
- },
- didInsertElement:function () {
- $('body').on('click.popover', Em.run.bind(this,this.hideMultiply));
- },
- hideMultiply:function (e) {
- if (!this.$()) {
- return;
- }
- if (!this.$().is(e.target) && this.$().has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
- this.set('popover.isVisible',false);
- }
- },
- willClearRender:function () {
- this.get('popover').$element.off('click');
- $('body').off('click.popover');
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/rename-modal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/rename-modal.js b/contrib/views/files/src/main/resources/ui/app/components/rename-modal.js
new file mode 100644
index 0000000..09ae061
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/rename-modal.js
@@ -0,0 +1,77 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import OperationModal from '../mixins/operation-modal';
+
+export default Ember.Component.extend(OperationModal, {
+ closeOnEscape: true,
+ hasError: false,
+ errorMessage: '',
+ isUpdating: false,
+ renameService: Ember.inject.service('file-rename'),
+ fileSelectionService: Ember.inject.service('files-selection'),
+ selectedFiles: Ember.computed.alias('fileSelectionService.files'),
+ selected: Ember.computed('selectedFiles', function() {
+ return this.get('selectedFiles').objectAt(0);
+ }),
+ selectionName: Ember.computed.oneWay('selected.name'),
+ hasErrorReset: Ember.observer('selectionName', 'selected.name', function() {
+ if (this.get('hasError') && (this.get('selectionName') !== this.get('selected.name'))) {
+ this.set('hasError', false);
+ }
+ }),
+
+ actions: {
+ didOpenModal: function() {
+ this.set('selectionName', this.get('selected.name'));
+ // This was required as the DOM may not be visible due to animation in bootstrap modal
+ Ember.run.later(() => {
+ this.$('input').focus();
+ }, 500);
+
+ },
+
+ rename: function() {
+ if(Ember.isBlank(this.get('selectionName'))) {
+ return false;
+ }
+
+ if(this.get('selected.name') === this.get('selectionName')) {
+ this.set('hasError', true);
+ this.set('errorMessage', 'Name should be different');
+ return false;
+ }
+ this.set('isUpdating', true);
+ this.get('renameService').rename(this.get('selected.path'), this.get('selectionName'))
+ .then((response) => {
+ this.set('isUpdating', false);
+ this.send('close');
+ this.sendAction('refreshAction');
+ }, (error) => {
+ this.set('isUpdating', false);
+ if(error.retry) {
+ this.set('hasError', true);
+ this.set('errorMessage', error.message);
+ } else {
+ this.send('close');
+ }
+ });
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/renameInput.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/renameInput.js b/contrib/views/files/src/main/resources/ui/app/components/renameInput.js
deleted file mode 100644
index 965cebd..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/renameInput.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-var App = require('app');
-
-App.RenameInputComponent = Ember.Component.extend({
- tagName:'span',
- layoutName:'components/renameInput',
- actions:{
- rename:function (opt) {
- var tmpName;
-
- switch (opt) {
- case 'edit': this.set('isRenaming',true); break;
- case 'cancel': this.set('isRenaming',false); break;
- case 'confirm':
- tmpName = this.get('tmpName');
- if (tmpName.length ===0) {
- break;
- }
- this.sendAction('confirm',this.get('filePath'),tmpName);
- this.set('isRenaming',false);
- break;
-
- default: this.toggleProperty('isRenaming');
- }
- }
- },
-
- /**
- * passed params
- */
- file:null,
- actionName:null,
- isRenaming:false,
-
- fileName:function () {
- var file = this.get('file');
- return (file instanceof DS.Model)?file.get('name'):file.substr(file.lastIndexOf('/')+1);
- }.property('file'),
-
- filePath:function () {
- var file = this.get('file');
- return (file instanceof DS.Model)?file.get('path'):file;
- }.property('file'),
-
- setTmpName:function () {
- if (this.get('isRenaming')) {
- this.set('tmpName',this.get('fileName'));
- } else {
- this.set('tmpName','');
- }
- }.observes('isRenaming'),
-
- onFileChange:function () {
- this.set('isRenaming',false);
- }.observes('file'),
-
- renameInputView: Em.TextField.extend({
- controller:null,
- didInsertElement:function () {
- var element = $(this.get('element'));
- element.focus().val(this.value);
- },
- keyUp: function(e) {
- var target = this.get('targetObject');
- if (e.keyCode==13) {
- return target.send('rename', 'confirm');
- }
-
- if (e.keyCode==27) {
- return target.send('rename', 'cancel');
- }
- }
- })
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/sortArrow.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/sortArrow.js b/contrib/views/files/src/main/resources/ui/app/components/sortArrow.js
deleted file mode 100644
index c680c41..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/sortArrow.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.SortArrowComponent = Em.Component.extend({
- layout:Ember.Handlebars.compile('<i {{bind-attr class=":fa asc:fa-chevron-down:fa-chevron-up cur::fa-gr view.cur::fa-rotate-270" }} ></i>'),
- classNames:['pull-right'],
- tagName:'span',
- sPs:[],
- sA:false,
- sP:null,
- asc:true,
- cur:false,
- sorting:function () {
- var isSp = this.get('sPs.firstObject') == this.get('sP');
- this.setProperties({'asc':(isSp)?this.get('sA'):true,'cur':isSp});
- }.observes('sPs','sA').on('didInsertElement')
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/toggleContext.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/toggleContext.js b/contrib/views/files/src/main/resources/ui/app/components/toggleContext.js
deleted file mode 100644
index 10f1b52..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/toggleContext.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-function _shake (element) {
- var l = 5;
- for ( var i = 0; i < 4; i++ ) {
- element.animate( (l>0) ? {'margin-left':(l=-l)+'px','padding-left':0}:{'padding-left':+(l=-l)+'px','margin-left':0}, 50, function (el) {
- element.css({'padding-left':0,'margin-left':0});
- });
- }
-}
-
-App.ToggleContextComponent = Em.Component.extend({
- didInsertElement:function () {
- var fileRow = this.$().parents('tr'),
- beforeHandler = Ember.run.bind(this, this.setContext),
- itemHandler = Ember.run.bind(this, this.itemHandler);
-
- fileRow.on('click',Ember.run.bind(this, this.openOnClick));
-
- fileRow.contextmenu({
- target:'#context-menu',
- before:beforeHandler,
- onItem:itemHandler
- });
- },
- setContext:function(e) {
- if (this.get('targetObject.isMoving')) {
- return false;
- }
- this.set('targetObject.parentController.targetContextMenu',this.get('targetObject'));
- return true;
- },
- itemHandler:function (t,e) {
- if (e.target.dataset.disabled) {
- return false;
- }
- },
- openOnClick:function (e) {
- if($(e.target).is('td') || $(e.target).hasClass('allow-open')){
- this.get('targetObject').send('open');
- }
- },
- willClearRender:function () {
- var fileRow = this.$().parents('tr');
- fileRow.off('click');
- fileRow.data('context').closemenu();
- fileRow.data('context').destroy();
- }
-});
-
-App.FileShakerComponent = Em.Component.extend({
- action:'',
- isValid:false,
- click:function () {
- if (this.get('isValid')) {
- this.sendAction('action');
- } else {
- _shake(this.$());
- }
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/upload-file.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/upload-file.js b/contrib/views/files/src/main/resources/ui/app/components/upload-file.js
new file mode 100644
index 0000000..9da6854
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/upload-file.js
@@ -0,0 +1,92 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import OperationModal from '../mixins/operation-modal';
+import FileUploader from '../utils/file-uploader';
+
+export default Ember.Component.extend(OperationModal, {
+ modalEventBus: Ember.inject.service('modal-event-bus'),
+ fileOperationService: Ember.inject.service('file-operation'),
+ logger: Ember.inject.service('alert-messages'),
+ tagName: "span",
+ closeOnEscape: true,
+ name: 'ctx-uploader',
+ path: '',
+ isUploading: false,
+ uploadFileName: '',
+ uploadPercent: '0%',
+ uploadPercentStyle: Ember.computed('uploadPercent', function() {
+ var style = 'width: ' + this.get('uploadPercent') + ';';
+ return style.htmlSafe();
+ }),
+ didInitAttrs: function() {
+ this.get('modalEventBus').registerModal("ctx-uploader");
+ },
+ willDestroyElement() {
+ this.get('modalEventBus').resetModal("ctx-uploader");
+ },
+ setUploadPercent: function(percent) {
+ var intValue = Math.round(percent);
+ this.set('uploadPercent', `${intValue}%`);
+ },
+
+ setUploading: function(fileName) {
+ this.set('uploadFileName', fileName);
+ this.set('isUploading', true);
+ this.set('closeOnEscape', false);
+ },
+
+ actions: {
+ openModal : function() {
+ this.get('modalEventBus').showModal('ctx-uploader');
+ },
+ didOpenModal: function() {
+ this.set('isUploading', false);
+ this.set('uploadFileName', '');
+ this.set('closeOnEscape', true);
+ },
+
+ fileLoaded: function(file) {
+ var url = this.get('fileOperationService').getUploadUrl();
+ var uploader = FileUploader.create({
+ url: url
+ });
+ if(!Ember.isEmpty(file)) {
+ uploader.upload(file, {path: this.get('path')});
+ this.setUploading(file.name);
+ uploader.on('progress', (e) => {
+ this.setUploadPercent(e.percent);
+ });
+ uploader.on('didUpload', (e) => {
+ this.send('close');
+ this.sendAction('refreshAction');
+ });
+ uploader.on('didError', (jqXHR, textStatus, errorThrown) => {
+ var error = Ember.$.parseJSON(jqXHR.responseText);
+ this.get('logger').danger(`Failed to upload ${file.name} to ${this.get('path')}`, error);
+ this.send('close');
+ return false;
+ });
+ }
+
+ }
+
+ }
+});
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/uploader.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/uploader.js b/contrib/views/files/src/main/resources/ui/app/components/uploader.js
deleted file mode 100644
index f6e61c4..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/uploader.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-var App = require('app');
-
-App.FileUploaderComponent = Ember.Component.extend({
- didInsertElement:function () {
- var _this = this;
- this.uploader.reopen({
- sendAlert:function (e) {
- _this.sendAction('alert',e);
- }
- });
- this.fileInput.reopen({
- filesDidChange: function() {
- var files = this.get('files');
- if (!files) {
- this.set('parentView.files',null);
- this.set('parentView.controlInput.value','');
- this.set('value','');
- return;
- }
- var numFiles = files ? files.length : 1;
- var label = this.get('value').replace(/\\/g, '/').replace(/.*\//, '');
- var log = numFiles > 1 ? numFiles + ' files selected' : label;
-
- this.set('parentView.controlInput.value',log);
- this.set('parentView.files',files);
-
- }.observes('files')
- });
- },
- actions:{
- upload:function () {
- this.uploadFile();
- },
- clear:function () {
- this.set('fileInput.files',null);
- }
- },
- uploader: null,
- layoutName:'components/uploader',
- path:'',
- info:'',
- files:null,
- isFiles:function () {
- return !this.get('files.length');
- }.property('files'),
- uploadFile:function () {
- var path = this.get('path');
- var uploader = this.get('uploader');
- var uploadBtn = Ladda.create(this.uploadButton.get('element'));
- var reset = function () {
- uploadBtn.stop();
- this.send('clear');
- };
- if (!uploader.get('isUploading')) {
- if (!Ember.isEmpty(this.get('files'))) {
- var file = this.get('files')[0];
- uploadBtn.start();
- uploader.on('progress',function (e) {
- uploadBtn.setProgress(e.percent/100);
- });
- uploader.upload(file,{path:path}).finally(Em.run.bind(this,reset));
- }
- }
- },
- uploadButton: Em.View.createWithMixins(Ember.TargetActionSupport, {
- tagName:'button',
- target: Ember.computed.alias('controller'),
- classNames:['btn','ladda-button'],
- classNameBindings:['isFiles:hide','target.isError:btn-danger:btn-success'],
- attributeBindings: ["data-style","data-size"],
- action:'upload',
- click: function() {
- this.triggerAction();
- }
- }),
- fileInput : Ember.TextField.create({
- type: 'file',
- attributeBindings: ['multiple'],
- multiple: false,
- files:null,
- change: function(e) {
- var input = e.target;
- if (!Ember.isEmpty(input.files)) {
- this.set('files', input.files);
- }
- }
- }),
- controlInput:Ember.TextField.create({
- readonly:true,
- classNames:['form-control']
- })
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/config/files-columns.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/config/files-columns.js b/contrib/views/files/src/main/resources/ui/app/config/files-columns.js
new file mode 100644
index 0000000..4dce394
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/config/files-columns.js
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ Static configuration for the columns to be shown.
+*/
+var columnsConfig = [
+ {
+ title: 'Name',
+ key: 'name',
+ isVisible: true,
+ sortable: true,
+ sortOrder: 0,
+ columnClass: 'col-md-4 col-xs-4'
+ },
+ {
+ title: 'Size',
+ key: 'size',
+ isVisible: true,
+ sortable: true,
+ sortOrder: 0,
+ columnClass: 'col-md-1 col-xs-1'
+ },
+ {
+ title: 'Last Modified',
+ key: 'date',
+ isVisible: true,
+ sortable: true,
+ sortOrder: 0,
+ columnClass: 'col-md-2 col-xs-2'
+ },
+ {
+ title: 'Owner',
+ key: 'owner',
+ isVisible: true,
+ sortable: true,
+ sortOrder: 0,
+ columnClass: 'col-md-2 col-xs-2'
+ },
+ {
+ title: 'Group',
+ key: 'group',
+ isVisible: true,
+ sortable: true,
+ sortOrder: 0,
+ columnClass: 'col-md-1 col-xs-1'
+ },
+ {
+ title: 'Permission',
+ key: 'permission',
+ isVisible: true,
+ sortable: false,
+ sortOrder: 0,
+ columnClass: 'col-md-2 col-xs-2'
+ }
+];
+
+export default columnsConfig;
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/.gitkeep b/contrib/views/files/src/main/resources/ui/app/controllers/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/application.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/application.js b/contrib/views/files/src/main/resources/ui/app/controllers/application.js
new file mode 100644
index 0000000..29ab49c
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/controllers/application.js
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+ firstLoad: true,
+ isLoading: false
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/chmodModal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/chmodModal.js b/contrib/views/files/src/main/resources/ui/app/controllers/chmodModal.js
deleted file mode 100644
index a7170f7..0000000
--- a/contrib/views/files/src/main/resources/ui/app/controllers/chmodModal.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-var _permissionsProp = function(n, l) {
- return function (arg,val) {
- if (arguments.length > 1) {
- this.set('permissions', this.replaceAt(n,(val)?l:'-'));
- return val;
- }
- return this.get('permissions')[n]===l;
- };
-};
-
-App.ChmodModalController = Em.ObjectController.extend({
- needs:['files'],
- classNames:'chmod-row',
- file:Em.computed.alias('content'),
- permissions:Em.computed.alias('file.permission'),
- usrR:_permissionsProp(1, 'r').property('permissions'),
- usrW:_permissionsProp(2, 'w').property('permissions'),
- usrE:_permissionsProp(3, 'x').property('permissions'),
- grpR:_permissionsProp(4, 'r').property('permissions'),
- grpW:_permissionsProp(5, 'w').property('permissions'),
- grpE:_permissionsProp(6, 'x').property('permissions'),
- otrR:_permissionsProp(7, 'r').property('permissions'),
- otrW:_permissionsProp(8, 'w').property('permissions'),
- otrE:_permissionsProp(9, 'x').property('permissions'),
- replaceAt:function (index,p) {
- var perm = this.get('permissions');
- return perm.substr(0, index) + p + perm.substr(index + p.length);
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/error.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/error.js b/contrib/views/files/src/main/resources/ui/app/controllers/error.js
deleted file mode 100644
index efcc4de..0000000
--- a/contrib/views/files/src/main/resources/ui/app/controllers/error.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-App.ErrorController = Ember.ObjectController.extend({
- actions: {
- toggleStackTrace:function () {
- var value = this.get('isExpanded');
- this.set('isExpanded', !value);
- }
- },
-
- isExpanded: false,
-
- publicMessage:function () {
- var content = this.get('content');
- var text = content.statusText;
- if (content && content.responseText) {
- var json = JSON.parse(content.responseText);
- text = json.message;
- } else if (content && content.message) {
- text = content.message;
- }
- return text;
- }.property('content'),
- stackTrace:function () {
- var content = this.get('content');
- var trace = null;
- if (content && content.responseText) {
- var json = JSON.parse(content.responseText);
- trace = json.trace;
- }
- return trace;
- }.property('content')
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/file.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/file.js b/contrib/views/files/src/main/resources/ui/app/controllers/file.js
deleted file mode 100644
index 88fa5fb..0000000
--- a/contrib/views/files/src/main/resources/ui/app/controllers/file.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.FileController = Ember.ObjectController.extend({
- needs:['files'],
- actions:{
- confirmPreview:function (file) {
- this.downloadFile(file, "browse");
- },
- download:function (option) {
- this.downloadFile(this.get('content'), option);
- },
- preview:function (option) {
- this.send('showPreviewModal',this.get('content'));
- },
- showChmod:function () {
- this.send('showChmodModal',this.get('content'));
- },
- rename:function (opt,name) {
- var file = this.get('content'),
- path = file.get('path'),
- newPath;
-
- if (name === file.get('name') || Em.isEmpty(name)) {
- return this.set('isRenaming',!Em.isEmpty(name));
- }
-
- newPath = path.substring(0,path.lastIndexOf('/')+1)+name;
-
- this.store.move(file,newPath)
- .then(Em.run.bind(this,this.set,'isRenaming',false),Em.run.bind(this,this.sendAlert));
- },
- editName:function () {
- this.set('isRenaming',true);
- },
- open:function (file) {
- if (this.get('content.isDirectory')) {
- return this.transitionToRoute('files',{queryParams: {path: this.get('content.id')}});
- } else{
- //return this.send('download');
- return this.send('preview');
- }
- },
- deleteFile:function (deleteForever) {
- this.store
- .remove(this.get('content'),!deleteForever)
- .then(null,Em.run.bind(this,this.deleteErrorCallback,this.get('content')));
- }
- },
- selected:false,
- isRenaming:false,
- isMovingToTrash:false,
- chmodVisible:false,
- targetContextMenu:null,
- isPermissionsDirty:function () {
- var file = this.get('content');
- var diff = file.changedAttributes();
- return !!diff.permission;
- }.property('content.permission'),
- isMoving:function () {
- var movingFile = this.get('parentController.movingFile.path');
- var thisFile = this.get('content.id');
- return movingFile === thisFile;
- }.property('parentController.movingFile'),
-
- setSelected:function (controller,observer) {
- this.set('selected',this.get(observer));
- }.observes('content.selected'),
-
- renameSuccessCallback:function (record,error) {
- record.rollback();
- this.sendAlert(error);
- },
-
- dirInfo: Em.computed.alias('controllers.files.content.meta'),
-
- deleteErrorCallback:function (record,error) {
- this.get('parentController.model').pushRecord(record);
- this.send('showAlert',error);
- },
-
- sendAlert:function (error) {
- this.send('showAlert',error);
- },
- downloadFile: function(files, option) {
- var _this = this;
- this.store.linkFor([files], option, false, true).then(function(link) {
- var that = _this;
- Ember.$.get(link).done(function(data) {
- if(data.allowed) {
- that.store.linkFor([files],option).then(function (link) {
- window.location.href = link;
- },Em.run.bind(that,that.sendAlert));
- }
- }).fail(function(jqXHR, textStatus, errorThrown) {
- that.send('showAlert', jqXHR);
- });
- }, Em.run.bind(this,this.sendAlert));
- }
-});
[04/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/files.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/files.js b/contrib/views/files/src/main/resources/ui/app/controllers/files.js
index 1315f31..4b60ab3 100644
--- a/contrib/views/files/src/main/resources/ui/app/controllers/files.js
+++ b/contrib/views/files/src/main/resources/ui/app/controllers/files.js
@@ -16,201 +16,154 @@
* limitations under the License.
*/
-var App = require('app');
-var bind = Ember.run.bind;
-
-App.FilesController = Ember.ArrayController.extend({
- actions:{
- moveFile:function (opt,fileArg) {
- var src, title,
- file = fileArg || this.get('selectedFiles.firstObject'),
- moving = this.get('movingFile');
-
- if (opt == 'cut') {
- src = file.toJSON({includeId: true});
- src = Em.merge(src,{name:file.get('name'),path:file.get('path')});
- this.set('movingFile',src);
- }
-
- if (opt == 'move') {
- this.store.move(moving.path,[this.get('path'),moving.name].join('/').replace('//','/'))
- .then(bind(this,this.set,'movingFile',null),bind(this,this.throwAlert));
- }
+import Ember from 'ember';
+import columnConfig from '../config/files-columns';
+
+export default Ember.Controller.extend({
+ fileSelectionService: Ember.inject.service('files-selection'),
+ lastSelectedFile: Ember.computed.oneWay('fileSelectionService.lastFileSelected'),
+ selectedFilesCount: Ember.computed.oneWay('fileSelectionService.filesCount'),
+ selectedFolderCount: Ember.computed.oneWay('fileSelectionService.folderCount'),
+ isSelected: Ember.computed('selectedFilesCount', 'selectedFolderCount', function() {
+ return (this.get('selectedFilesCount') + this.get('selectedFolderCount')) !== 0;
+ }),
- if (opt == 'cancel') {
- this.set('movingFile',null);
- }
- },
- showRenameInput:function () {
- this.toggleProperty('isRenaming');
- },
- renameDir:function (path,newName) {
- var _this = this,
- basedir = path.substring(0,path.lastIndexOf('/')+1);
- newPath = basedir + newName;
-
- if (path === newPath) {
- return false;
- }
-
- this.store.listdir(basedir).then(function (listdir) {
- var recordExists = listdir.isAny('id',newPath);
-
- listdir.forEach(function (file) {
- _this.store.unloadRecord(file);
- });
+ queryParams: ['path'],
+ path: '/',
+ columns: columnConfig,
+
+ hasHomePath: false,
+ hasTrashPath: false,
+
+ currentPathIsTrash: Ember.computed('path', 'trashPath', 'hasTrashPath', function() {
+ return this.get('hasTrashPath') && (this.get('path') === this.get('trashPath'));
+ }),
+
+ // This is required as the validSearchText will be debounced and will not be
+ // called at each change of searchText. searchText is required so that sub
+ // components(file search componenet) UI can be cleared from outside.(i.e, from
+ // the afterModel of the route when the route changes)
+ searchText: '',
+ validSearchText: '',
+
+ sortProperty: [],
+ sortEnabled: Ember.computed('fileSelectionService.files.length', function() {
+ return this.get('fileSelectionService.files.length') === 0;
+ }),
+
+ allSelected: Ember.computed('fileSelectionService.files.length', function() {
+ return this.get('fileSelectionService.files.length') !== 0 && this.get('fileSelectionService.files.length') === this.get('model.length');
+ }),
+
+ parentPath: Ember.computed('path', function() {
+ var path = this.get('path');
+ var parentPath = path.substring(0, path.lastIndexOf('/'));
+ if(Ember.isBlank(parentPath)) {
+ parentPath = '/';
+ }
- if (recordExists) {
- return _this.throwAlert({message:newPath + ' already exists.'});
- }
+ if(path === '/') {
+ parentPath = '';
+ }
+ return parentPath;
+ }),
- return _this.store.move(path,newPath);
- }).then(function (newDir) {
- if (newDir) {
- _this.store.unloadRecord(newDir);
- _this.set('path',newPath);
- }
- }).catch(bind(this,this.throwAlert));
+ sortedContent: Ember.computed.sort('model', 'sortProperty'),
- },
- deleteFile:function (deleteForever) {
- var self = this,
- selected = this.get('selectedFiles'),
- moveToTrash = !deleteForever;
- selected.forEach(function (file) {
- self.store.remove(file,moveToTrash).then(null,bind(self,self.deleteErrorCallback,file));
+ arrangedContent: Ember.computed('model', 'sortProperty', 'validSearchText', function() {
+ var searchText = this.get('validSearchText');
+ if(!Ember.isBlank(searchText)) {
+ return this.get('sortedContent').filter(function(entry) {
+ return !!entry.get('name').match(searchText);
});
+ }
+ return this.get('sortedContent');
+ }),
+
+ actions: {
+ sortFiles: function(sortColumn) {
+ if (sortColumn['sortOrder'] !== 0) {
+ var sortProperty = sortColumn['key'] + ':' + this._getSortOrderString(sortColumn);
+ this.set('sortProperty', [sortProperty]);
+ } else {
+ this.set('sortProperty', []);
+ }
},
- download:function (option) {
- var files = this.get('selectedFiles').filterBy('readAccess',true);
- var content = this.get('content');
- this.store.linkFor(content, option).then(function (link) {
- window.location.href = link;
- });
+
+ searchFiles: function(searchText) {
+ this.set('validSearchText', searchText);
},
- mkdir:function (newDirName) {
- this.store.mkdir(newDirName)
- .then(bind(this,this.mkdirSuccessCalback),bind(this,this.throwAlert));
+ /* Selects a single file. Clears previous selection */
+ selectSingle: function(file) {
+ this.get('fileSelectionService').deselectAll();
+ this.get('fileSelectionService').selectFiles([file]);
},
- upload:function (opt) {
- if (opt === 'open') {
- this.set('isUploading',true);
- }
- if (opt === 'close') {
- this.set('isUploading',false);
+ /*
+ Selects file without clearing the previous selection. If sticky is true
+ then shiftkey was pressed while clicking and we should select all the
+ files in between
+ */
+ selectMultiple: function(file, sticky) {
+ if(!sticky) {
+ if(file.get('isSelected')) {
+ this.get('fileSelectionService').deselectFile(file);
+ } else {
+ this.get('fileSelectionService').selectFiles([file]);
+ }
+ } else {
+ var lastFileSelected = this.get('fileSelectionService.lastFileSelected');
+ var indexRange = this._getIndexRangeBetweenfiles(lastFileSelected, file);
+ if(indexRange[0] === indexRange[1]) {
+ return false;
+ }
+ var filesInRange = this._getFilesInRange(indexRange[0], indexRange[1]);
+ this.get('fileSelectionService').deselectAll();
+ this.get('fileSelectionService').selectFiles(filesInRange);
}
},
- sort:function (pr) {
- var currentProperty = this.get('sortProperties');
- if (pr == currentProperty[0] || pr == 'toggle') {
- this.toggleProperty('sortAscending');
- } else{
- this.set('sortProperties',[pr]);
- this.set('sortAscending',true);
+
+ selectAll: function(selectStatus) {
+ this.get('fileSelectionService').deselectAll();
+ if(selectStatus === false) {
+ this.get('fileSelectionService').selectFiles(this.get('sortedContent'));
}
},
- confirmChmod:function (file) {
- this.store
- .chmod(file)
- .then(null,Em.run.bind(this,this.chmodErrorCallback,file));
- },
- confirmPreview:function (file) {
- //this.send('download');
- this.store.linkFor(file, "browse").then(function (link) {
- window.location.href = link;
- });
- },
- clearSearchField:function () {
- this.set('searchString','');
- }
- },
- init:function () {
- if (App.testing) {
- return this._super();
- }
- var controller = this;
- var adapter = controller.store.adapterFor('file');
- var url = adapter.buildURL('upload');
- this.uploader.set('url',url);
- this.uploader.on('didUpload', function (payload) {
- controller.store.pushPayload('file', {'file': payload });
- });
- this._super();
- },
- sortProperties: ['name'],
- sortAscending: true,
+ /* Deselects the current selections */
+ deselectAll: function() {
+ this.get('fileSelectionService').deselectAll();
+ },
- needs: ["file"],
- movingFile:null,
- uploader:App.Uploader,
- isRenaming:false,
- isUploading:false,
- queryParams: ['path'],
- path: '/',
- isRootDir:Ember.computed.equal('path', '/'),
- hideMoving:function () {
- return (this.movingFile)?[this.path,this.movingFile.name].join('/').replace('//','/')===this.movingFile.path:false;
- }.property('movingFile','path'),
- currentDir:function () {
- return this.get('path').split('/').get('lastObject') || '/';
- }.property('path'),
- selectedOne:Ember.computed.equal('selectedFiles.length', 1),
- isSelected:Ember.computed.gt('selectedFiles.length', 0),
- selectedFiles:function () {
- return this.get('content').filterBy('selected', true);
- }.property('content.@each.selected'),
- canConcat:function () {
- return this.get('selectedFiles').filterProperty('isDirectory').get('length')===0;
- }.property('selectedFiles.length'),
-
- isSortPropertyEqualsDate: function() {
- return this.get('sortProperties').get('firstObject') === 'date';
- }.property('sortProperties.firstObject'),
-
- searchString:'',
- fileList: function () {
- var fileList = this.get('arrangedContent');
- var search = this.get('searchString');
- return (search)?fileList.filter(function (file) {
- return !!file.get('name').match(search);
- }):fileList;
- }.property('arrangedContent','searchString'),
-
- mkdirSuccessCalback:function (newDir) {
- if (newDir.get('path') != [this.get('path'),newDir.get('name')].join('/')){
- newDir.unloadRecord();
- newDir.store.listdir(this.get('path'));
+ //Context Menu actions
+ openFolder: function(path) {
+ this.transitionToRoute({queryParams: {path: path}});
}
},
- clearSearch:function () {
- this.set('searchString','');
- }.observes('path'),
-
- deleteErrorCallback:function (record,error) {
- this.model.pushRecord(record);
- this.throwAlert(error);
- },
-
- chmodErrorCallback:function (record,error) {
- record.rollback();
- this.throwAlert({message:'Permissions change failed'});
- },
-
- throwAlert:function (error) {
- this.send('showAlert',error);
+ _getIndexRangeBetweenfiles: function(startFile, endFile) {
+ var startIndex = this.get('arrangedContent').indexOf(startFile);
+ var endIndex = this.get('arrangedContent').indexOf(endFile);
+ if (startIndex < endIndex) {
+ return [startIndex, endIndex];
+ } else {
+ return [endIndex, startIndex];
+ }
},
- showSpinner:function () {
- this.set('isLoadingFiles',true);
+ _getFilesInRange: function(startIndex, endIndex) {
+ var range = Array.apply(null, Array(endIndex - startIndex + 1)).map(function (_, i) {return startIndex + i;});
+ return this.get('arrangedContent').objectsAt(range);
},
- hideSpinner:function () {
- this.set('isLoadingFiles',false);
+ _getSortOrderString: function(column) {
+ if (column['sortOrder'] === -1) {
+ return 'desc';
+ } else if (column['sortOrder'] === 1) {
+ return 'asc';
+ } else {
+ return '';
+ }
}
});
-
-
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/filesAlert.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/filesAlert.js b/contrib/views/files/src/main/resources/ui/app/controllers/filesAlert.js
deleted file mode 100644
index 64221e3..0000000
--- a/contrib/views/files/src/main/resources/ui/app/controllers/filesAlert.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-App.FilesAlertController = App.ErrorController.extend({
- content:null,
- output:function () {
- var error = this.get('content'),
- message = (error.responseJSON)?error.responseJSON.message:error.message,
- output;
-
- if (message) {
- message = message.split('\n').objectAt(0);
- }
-
- return message;
- }.property('content')
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/messages.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/messages.js b/contrib/views/files/src/main/resources/ui/app/controllers/messages.js
new file mode 100644
index 0000000..52655e3
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/controllers/messages.js
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+ filesController: Ember.inject.controller('files'),
+ currentBrowserPath: Ember.computed.oneWay('filesController.path'),
+ isExpanded: true,
+ shortenLength: Ember.computed('isExpanded', function() {
+ if(this.get('isExpanded') === true) {
+ return 200;
+ } else {
+ return 100;
+ }
+ })
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/messages/message.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/messages/message.js b/contrib/views/files/src/main/resources/ui/app/controllers/messages/message.js
new file mode 100644
index 0000000..d46c1f6
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/controllers/messages/message.js
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+
+ showStatus: Ember.computed('model', function() {
+ return this.get('model.status') !== -1;
+ }),
+
+ displayBody: Ember.computed('model', function() {
+ return !(Ember.isBlank(this.get('model.responseMessage'))
+ && Ember.isBlank(this.get('model.trace')));
+ })
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/controllers/previewModal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/controllers/previewModal.js b/contrib/views/files/src/main/resources/ui/app/controllers/previewModal.js
deleted file mode 100644
index 35973b2..0000000
--- a/contrib/views/files/src/main/resources/ui/app/controllers/previewModal.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.PreviewModalController = Em.ObjectController.extend({
- needs:['files', 'file'],
- offset: 3000 ,
- startIndex:0,
- file:Em.computed.alias('content'),
- filePageText:'',
- reload: false,
- pagecontent: Ember.computed('file', 'startIndex', 'endIndex', 'reload', function() {
- var file = this.get('file');
- var filepath = file.get('path');
- var filePageText = this.get('filePageText');
-
- var self = this,
- defer = Ember.RSVP.defer(),
- startIndex = this.get('startIndex'),
- endIndex = this.get('endIndex');
-
- var pathName = window.location.pathname;
- var pathNameArray = pathName.split("/");
- var ViewVersion = pathNameArray[3];
- var viewName = pathNameArray[4];
- var previewServiceURL = "/api/v1/views/FILES/versions/"+ ViewVersion + "/instances/" + viewName + "/resources/files/preview/file" + '?path=' + filepath + '&start='+ startIndex +'&end='+ endIndex;
-
- var previousText = $('.preview-content').text();
-
- $.ajax({
- url: previewServiceURL,
- dataType: "json",
- type: 'get',
- async: false,
- contentType: 'application/json',
- success: function( response, textStatus, jQxhr ){
- self.set('filePageText', previousText + response.data);
- self.set('isFileEnd',response.isFileEnd);
- },
- error: function( jqXhr, textStatus, errorThrown ){
- console.log( "Preview Fail pagecontent : " + errorThrown );
- self.send('removePreviewModal');
- self.send('showAlert', jqXhr);
- self.set('reload', !self.get('reload'));
- }
- });
-
- if(self.get('isFileEnd') == true){
- this.set('showNext', false);
- }
- return self.get('filePageText');
- }),
- endIndex: Ember.computed('startIndex', 'offset', function() {
- var startIndex = this.get('startIndex'),
- offset = this.get('offset');
- return startIndex + offset;
- }),
- showPrev : Ember.computed('startIndex', function() {
- var startIndex = this.get('startIndex');
- this.set('showNext', true);
- return ((startIndex == 0) ? false : true );
- }),
- showNext : true,
- actions:{
- next: function(){
- console.log('Next');
- this.set('startIndex', this.get('startIndex') + this.get('offset'));
- return this.get('filePageText');
- },
- prev: function(){
- console.log('Prev');
- this.set('startIndex', (this.get('startIndex') - this.get('offset')) > 0 ? (this.get('startIndex') - this.get('offset')) : 0);
- }
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/.gitkeep b/contrib/views/files/src/main/resources/ui/app/helpers/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/alert-message-context-class.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/alert-message-context-class.js b/contrib/views/files/src/main/resources/ui/app/helpers/alert-message-context-class.js
new file mode 100644
index 0000000..28a5a8d
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/helpers/alert-message-context-class.js
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export function alertMessageContextClass(params) {
+ let messageType = params[0];
+ let prefix = params[1];
+ return `${prefix}${messageType}`;
+}
+
+export default Ember.Helper.helper(alertMessageContextClass);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/alert-message-icon-class.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/alert-message-icon-class.js b/contrib/views/files/src/main/resources/ui/app/helpers/alert-message-icon-class.js
new file mode 100644
index 0000000..707f2d1
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/helpers/alert-message-icon-class.js
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export function alertMessageIconClass(params) {
+ let type = params[0];
+ switch (type) {
+ case 'success':
+ return 'check';
+ case 'info':
+ return 'info';
+ case 'warning':
+ return 'exclamation';
+ case 'danger':
+ return 'times';
+ default:
+ return 'check';
+ }
+}
+
+export default Ember.Helper.helper(alertMessageIconClass);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/get-sorting-icon.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/get-sorting-icon.js b/contrib/views/files/src/main/resources/ui/app/helpers/get-sorting-icon.js
new file mode 100644
index 0000000..25601c8
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/helpers/get-sorting-icon.js
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export function getSortingIcon(params/*, hash*/) {
+ let sortOrder = params[0];
+ var iconClass;
+ if (sortOrder === 1) {
+ iconClass = "chevron-down";
+ } else if (sortOrder === -1) {
+ iconClass = "chevron-up";
+ } else {
+ iconClass = "chevron-right";
+ }
+ return iconClass;
+}
+
+export default Ember.Helper.helper(getSortingIcon);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/get-value-from-columns.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/get-value-from-columns.js b/contrib/views/files/src/main/resources/ui/app/helpers/get-value-from-columns.js
new file mode 100644
index 0000000..7570327
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/helpers/get-value-from-columns.js
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export function getValueFromColumns(params) {
+ let columnsArray = params[0];
+ let key = params[1];
+ let paramKey = params[2];
+
+ var column = columnsArray.filterBy('key', key);
+
+ if(column.length > 0) {
+ return column[0][paramKey];
+ }
+ return "";
+}
+
+export default Ember.Helper.helper(getValueFromColumns);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js b/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js
new file mode 100644
index 0000000..c50b5ca
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/helpers/shorten-text.js
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export function shortenText(params) {
+ let text = params[0];
+ let length = params[1];
+ if (text.length < length) {
+ return text;
+ } else {
+ return text.substring(0, length - 3) + '...';
+ }
+
+}
+
+export default Ember.Helper.helper(shortenText);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/show-date.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/show-date.js b/contrib/views/files/src/main/resources/ui/app/helpers/show-date.js
new file mode 100644
index 0000000..0f47982
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/helpers/show-date.js
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export function showDate(params) {
+ let date = params[0];
+ let format = params[1];
+ return moment(date).format(format);
+}
+
+export default Ember.Helper.helper(showDate);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/size-humanize.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/size-humanize.js b/contrib/views/files/src/main/resources/ui/app/helpers/size-humanize.js
new file mode 100644
index 0000000..2855ca4
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/helpers/size-humanize.js
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export function sizeHumanize(params) {
+ let fileSizeInBytes = params[0];
+ var i = -1;
+ var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
+ do {
+ fileSizeInBytes = fileSizeInBytes / 1024;
+ i++;
+ } while (fileSizeInBytes > 1024);
+
+ return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
+}
+
+export default Ember.Helper.helper(sizeHumanize);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/helpers/string-capitalize.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/helpers/string-capitalize.js b/contrib/views/files/src/main/resources/ui/app/helpers/string-capitalize.js
new file mode 100644
index 0000000..d24780d
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/helpers/string-capitalize.js
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export function stringCapitalize(params/*, hash*/) {
+ return params;
+}
+
+export default Ember.Helper.helper(stringCapitalize);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/index.html
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/index.html b/contrib/views/files/src/main/resources/ui/app/index.html
new file mode 100644
index 0000000..51d1839
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/index.html
@@ -0,0 +1,42 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <title>HDFS - File Browser</title>
+ <meta name="description" content="">
+
+ {{content-for "head"}}
+
+ <link rel="stylesheet" href="assets/vendor.css">
+ <link rel="stylesheet" href="assets/files-view.css">
+
+ {{content-for "head-footer"}}
+ </head>
+ <body>
+ {{content-for "body"}}
+
+ <script src="assets/vendor.js"></script>
+ <script src="assets/files-view.js"></script>
+
+ {{content-for "body-footer"}}
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/initialize.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/initialize.js b/contrib/views/files/src/main/resources/ui/app/initialize.js
deleted file mode 100644
index 7790397..0000000
--- a/contrib/views/files/src/main/resources/ui/app/initialize.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//////////////////////////////////
-// Adapter
-//////////////////////////////////
-
-require('adapter');
-
-//////////////////////////////////
-// Templates
-//////////////////////////////////
-
-require('templates/application');
-require('templates/index');
-require('templates/files');
-require('templates/error');
-require('templates/modal/chmod');
-require('templates/modal/preview');
-require('templates/util/errorRow');
-require('templates/util/fileRow');
-
-require('templates/components/uploader');
-require('templates/components/renameInput');
-require('templates/components/deletePopover');
-require('templates/components/mkdirInput');
-require('templates/components/contextMenu');
-require('templates/components/deleteBulk');
-
-//////////////////////////////////
-// Models
-//////////////////////////////////
-
-require('models/file');
-
-/////////////////////////////////
-// Controllers
-/////////////////////////////////
-
-require('controllers/files');
-require('controllers/file');
-require('controllers/error');
-require('controllers/filesAlert');
-require('controllers/chmodModal');
-require('controllers/previewModal');
-
-/////////////////////////////////
-// Components
-/////////////////////////////////
-
-require('components/uploader');
-require('components/contextMenu');
-require('components/renameInput');
-require('components/bsPopover');
-require('components/confirmDelete');
-require('components/sortArrow');
-require('components/breadCrumbs');
-require('components/popoverDelete');
-require('components/bulkCheckbox');
-require('components/mkdirInput');
-require('components/toggleContext');
-
-/////////////////////////////////
-// Views
-/////////////////////////////////
-
-require('views/file');
-require('views/files');
-require('views/filesAlert');
-require('views/modalChmod');
-require('views/modalPreview');
-
-/////////////////////////////////
-// Routes
-/////////////////////////////////
-
-require('routes/file');
-require('routes/error');
-
-/////////////////////////////////
-// Router
-/////////////////////////////////
-
-require('router');
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/mixins/file-operation.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/mixins/file-operation.js b/contrib/views/files/src/main/resources/ui/app/mixins/file-operation.js
new file mode 100644
index 0000000..6f4d070
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/mixins/file-operation.js
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+/*
+ Base Mixin to be used by different Services to get the common behaviors mixed
+ in to the service.
+*/
+export default Ember.Mixin.create({
+ store: Ember.inject.service('store'),
+
+ getBaseFilesURLPath: function() {
+ // TODO: This has to be changed when it is integrated inside Ambari
+ //var pathName = window.location.pathname;
+ var pathname = '/api/v1/views/FILES/versions/1.0.0/instances/Files/resources/files';
+ return pathname;
+ },
+
+ getBaseDirPath: function(path) {
+ return path.substring(0, path.lastIndexOf('/') + 1);
+ },
+
+ _getBaseURLFragments: function() {
+ var adapter = this.get('store').adapterFor('file');
+ var baseURL = adapter.buildURL('file');
+ return baseURL.split('/');
+ },
+
+ extractError: function(error) {
+ if (Ember.isArray(error.errors) && (error.errors.length >= 0)) {
+ return error.errors[0];
+ }
+ return {};
+ },
+
+ isInvalidError: function(error) {
+ // This seems to a slight hack. But from backend the response of 422 is
+ // always a hash which has success param set and value is false
+ return Ember.isPresent(error.success) && error.success === false;
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/mixins/operation-modal.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/mixins/operation-modal.js b/contrib/views/files/src/main/resources/ui/app/mixins/operation-modal.js
new file mode 100644
index 0000000..543498f
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/mixins/operation-modal.js
@@ -0,0 +1,82 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import { EKMixin, keyUp, EKFirstResponderOnFocusMixin } from 'ember-keyboard';
+
+export default Ember.Mixin.create(EKMixin, EKFirstResponderOnFocusMixin, {
+ modalEventBus: Ember.inject.service('modal-event-bus'),
+ name: '',
+ closeOnEscape: false,
+ isModalOpen: false,
+
+ setupKey: Ember.on('init', function() {
+ this.set('keyboardActivated', true);
+ }),
+
+ //disableEscape:
+ closeModalOnEscape: Ember.on(keyUp('Escape'), function() {
+ if (this.get('closeOnEscape')) {
+ this.$('.modal').modal('hide');
+ }
+ }),
+
+ initModal: function() {
+ Ember.defineProperty(this, 'modalGuard', Ember.computed.alias('modalEventBus.' + this.get('name')));
+ this.addObserver('modalGuard', () => {
+ if(this.get('modalGuard')) {
+ this.set('isModalOpen', true);
+ Ember.run.later(this, () => {
+ this.$('.modal').modal({backdrop: 'static', keyboard: false});
+ this.$('.modal').on('hide.bs.modal', () => {
+ this.send('closeModal');
+ });
+ this.send('modalOpened');
+ });
+
+ }
+ });
+ }.on('didInitAttrs'),
+
+ hideModal: Ember.on('willDestroyElement', function() {
+ if (this.get('isModalOpen')) {
+ this.$('.modal').modal('hide');
+ }
+ }),
+
+ actions: {
+ /** close by action in the UI **/
+ close: function() {
+ this.$('.modal').modal('hide');
+ },
+
+ closeModal: function() {
+ this.$('.modal').off('hide.bs.modal');
+ this.set('isModalOpen', false);
+ this.get('modalEventBus').resetModal(this.get('name'));
+ this.send('didCloseModal');
+ },
+
+ modalOpened: function() {
+ this.send('didOpenModal');
+ },
+
+ didCloseModal: function() {},
+ didOpenModal: function() {}
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/models/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/models/.gitkeep b/contrib/views/files/src/main/resources/ui/app/models/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/models/alert.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/models/alert.js b/contrib/views/files/src/main/resources/ui/app/models/alert.js
new file mode 100644
index 0000000..74b07f9
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/models/alert.js
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+
+export default DS.Model.extend({
+ type: DS.attr('string'),
+ message: DS.attr('string'),
+ responseMessage: DS.attr('string'),
+ status: DS.attr('number'),
+ trace: DS.attr('string')
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/models/file.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/models/file.js b/contrib/views/files/src/main/resources/ui/app/models/file.js
index 0e31f71..a2ed1f3 100644
--- a/contrib/views/files/src/main/resources/ui/app/models/file.js
+++ b/contrib/views/files/src/main/resources/ui/app/models/file.js
@@ -16,36 +16,36 @@
* limitations under the License.
*/
-var App = require('app');
+import DS from 'ember-data';
+import Ember from 'ember';
-var dsa = DS.attr;
+export default DS.Model.extend({
+
+ isDirectory : DS.attr('boolean'),
+ readAccess : DS.attr('boolean'),
+ writeAccess : DS.attr('boolean'),
+ executeAccess : DS.attr('boolean'),
+ len : DS.attr('number'),
+ owner : DS.attr('string'),
+ group : DS.attr('string'),
+ permission : DS.attr('string'),
+ accessTime : DS.attr('iso-date'),
+ modificationTime : DS.attr('iso-date'),
+ blockSize : DS.attr('number'),
+ replication : DS.attr('number'),
+ size : Ember.computed.alias('len'),
-App.File = DS.Model.extend({
path: function() {
return this.get('id');
}.property('id'),
- basedir:function () {
- var path = this.get('id');
- return path.substring(0,path.lastIndexOf('/'))||'/';
- }.property('id'),
- isDirectory: dsa('boolean'),
- readAccess: dsa('boolean'),
- writeAccess: dsa('boolean'),
- executeAccess: dsa('boolean'),
- len: dsa('number'),
- owner: dsa('string'),
- group: dsa('string'),
- permission: dsa('string'),
- accessTime: dsa('isodate'),
- modificationTime: dsa('isodate'),
- blockSize: dsa('number'),
- replication: dsa('number'),
- name:function () {
- var splitpath = this.get('path').split('/');
- return splitpath.get(splitpath.length-1);
+
+ name: function() {
+ var splitPath = this.get('path').split('/');
+ return splitPath.get(splitPath.length - 1);
}.property('path'),
- date:function () {
+
+ date: function() {
return parseInt(moment(this.get('modificationTime')).format('X'));
- }.property('modificationTime'),
- size: Em.computed.alias('len')
+ }.property('modificationTime')
+
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/router.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/router.js b/contrib/views/files/src/main/resources/ui/app/router.js
index b38ac00..801e932 100644
--- a/contrib/views/files/src/main/resources/ui/app/router.js
+++ b/contrib/views/files/src/main/resources/ui/app/router.js
@@ -16,8 +16,18 @@
* limitations under the License.
*/
-App = require('app');
+import Ember from 'ember';
+import config from './config/environment';
-App.Router.map(function() {
- this.route('files', { queryParams:['path'],path: '/',});
+const Router = Ember.Router.extend({
+ location: config.locationType
});
+
+Router.map(function() {
+ this.route('files');
+ this.route('messages', function() {
+ this.route('message', {path: '/:message_id'});
+ });
+});
+
+export default Router;
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/routes/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/routes/.gitkeep b/contrib/views/files/src/main/resources/ui/app/routes/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/routes/application.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/routes/application.js b/contrib/views/files/src/main/resources/ui/app/routes/application.js
new file mode 100644
index 0000000..eca62f4
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/routes/application.js
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+ fileOperationService: Ember.inject.service('file-operation'),
+ model: function() {
+ var promise = {
+ homeDir: this.get('fileOperationService').getHome(),
+ trashDir: this.get('fileOperationService').getTrash()
+ };
+
+ return Ember.RSVP.hashSettled(promise).then(function(hash) {
+ var response = {
+ homeDir: {path: '', hasError: true},
+ trashDir: {path: '', hasError: true}
+ };
+
+ if(hash.homeDir.state === 'fulfilled'){
+ response.homeDir.path = hash.homeDir.value.path;
+ response.homeDir.hasError = false;
+ }
+
+ if(hash.trashDir.state === 'fulfilled'){
+ response.trashDir.path = hash.trashDir.value.path;
+ response.trashDir.hasError = false;
+ }
+
+ return response;
+ });
+ },
+ setupController: function(controller, hash) {
+ this._super(controller, hash);
+ if(hash.homeDir.hasError === false) {
+ this.controllerFor('files').set('homePath', hash.homeDir.path);
+ this.controllerFor('files').set('hasHomePath', true);
+ }
+
+ if(hash.trashDir.hasError === false) {
+ this.controllerFor('files').set('trashPath', hash.trashDir.path);
+ this.controllerFor('files').set('hasTrashPath', true);
+ }
+ },
+
+ actions: {
+ loading(transition, route) {
+ let startTime = moment();
+ let appController = this.controllerFor('application');
+ // when the application loads up we want the loading template to be
+ // rendered and not the loading spinner in the application template
+ if(appController.get('firstLoad') === false) {
+ appController.set('isLoading', true);
+ }
+ transition.promise.finally(() => {
+ console.log("Loaded in " + (moment() - startTime) + "ms");
+ appController.set('isLoading', false);
+ appController.set('firstLoad', false);
+ });
+ return appController.get('firstLoad');
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/routes/error.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/routes/error.js b/contrib/views/files/src/main/resources/ui/app/routes/error.js
deleted file mode 100644
index 3b71cde..0000000
--- a/contrib/views/files/src/main/resources/ui/app/routes/error.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.ErrorRoute = Em.Route.extend({});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/routes/file.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/routes/file.js b/contrib/views/files/src/main/resources/ui/app/routes/file.js
deleted file mode 100644
index b64a7b1..0000000
--- a/contrib/views/files/src/main/resources/ui/app/routes/file.js
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.FilesRoute = Em.Route.extend({
- queryParams: {
- path: {
- refreshModel: true
- }
- },
- actions:{
- refreshDir:function () {
- this.refresh();
- },
- loading:function (argument) {
- var target = this.controllerFor('files');
- target.showSpinner();
- this.router.one('didTransition', target, 'hideSpinner');
- },
- error:function (error,transition,e) {
- this.controllerFor('files').set('isLoadingFiles', false);
- if (this.router._lookupActiveView('files')) {
- this.send('showAlert',error);
- } else {
- return true;
- }
- },
- dirUp: function () {
- var currentPath = this.controllerFor('files').get('path');
- var upDir = currentPath.substring(0,currentPath.lastIndexOf('/'));
- var target = upDir || '/';
- return this.transitionTo('files',{queryParams: {path: target}});
- },
- willTransition:function (argument) {
- var hasModal = this.router._lookupActiveView('modal.chmod'),
- hasAlert = this.router._lookupActiveView('files.alert'),
- hasPreviewModal = this.router._lookupActiveView('modal.preview');
-
- Em.run.next(function(){
- if (hasAlert) this.send('removeAlert');
- if (hasModal) this.send('removeChmodModal');
- if (hasPreviewModal) this.send('removePreviewModal');
- }.bind(this));
- },
-
- showChmodModal:function (content) {
- this.controllerFor('chmodModal').set('content',content);
- this.render('modal.chmod',{
- into:'files',
- outlet:'modal',
- controller:'chmodModal'
- });
- },
-
- showPreviewModal :function (content) {
- var controller = this.controllerFor('previewModal');
- controller.set('reload', true);
- controller.set('content',content);
- controller.set('startIndex',0);
-
- this.render('modal.preview',{
- into:'files',
- outlet:'modal',
- controller:'previewModal'
- });
- },
-
- removeChmodModal:function () {
- this.disconnectOutlet({
- outlet: 'modal',
- parentView: 'files'
- });
- },
- removePreviewModal:function () {
- this.disconnectOutlet({
- outlet: 'modal',
- parentView: 'files'
- });
- },
- showAlert:function (error) {
- this.controllerFor('filesAlert').set('content',error);
- this.render('files.alert',{
- into:'files',
- outlet:'error',
- controller:'filesAlert'
- });
- },
- removeAlert:function () {
- this.disconnectOutlet({
- outlet: 'error',
- parentView: 'files'
- });
- }
- },
- model:function (params) {
- var path = (Em.isEmpty(params.path))?'/':params.path;
- var model = this.store.listdir(path);
- this.set('prevModel',model);
- return model;
- },
- prevModel:null,
- beforeModel:function () {
- if (this.get('prevModel.isPending')) {
- this.get('prevModel').then(function (files) {
- files.forEach(function (file) {
- file.store.unloadRecord(file);
- });
- });
- }
- },
- afterModel: function (model) {
- this.store.all('file').forEach(function (file) {
- if (!model.contains(file)) {
- file.unloadRecord();
- }
- });
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/routes/files.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/routes/files.js b/contrib/views/files/src/main/resources/ui/app/routes/files.js
new file mode 100644
index 0000000..140732f
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/routes/files.js
@@ -0,0 +1,61 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FileOperationMixin from '../mixins/file-operation';
+
+export default Ember.Route.extend(FileOperationMixin, {
+ logger: Ember.inject.service('alert-messages'),
+ fileSelectionService: Ember.inject.service('files-selection'),
+ currentPath: '/',
+ queryParams: {
+ path: {
+ refreshModel: true
+ }
+ },
+ model: function(params) {
+ this.store.unloadAll('file');
+ return this.store.query('file', {path: params.path});
+ },
+
+ setupController: function(controller, model) {
+ this._super(controller, model);
+ controller.set('searchText', '');
+ this.get('fileSelectionService').reset();
+ this.set('currentPath', controller.get('path'));
+ },
+
+ actions: {
+ refreshCurrentRoute: function() {
+ this.refresh();
+ },
+
+ error: function(error, transition) {
+ this.get('fileSelectionService').reset();
+ let path = transition.queryParams.path;
+ var formattedError = this.extractError(error);
+ this.get('logger').danger(`Failed to transition to <strong>${path}</strong>`, formattedError);
+ // Had to do this as we are unloading all files before transitioning
+ this.transitionTo({
+ queryParams: {
+ path: this.get('currentPath')
+ }
+ });
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/routes/index.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/routes/index.js b/contrib/views/files/src/main/resources/ui/app/routes/index.js
new file mode 100644
index 0000000..1032334
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/routes/index.js
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+ beforeModel: function(transition) {
+ this.transitionTo('files');
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/routes/messages.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/routes/messages.js b/contrib/views/files/src/main/resources/ui/app/routes/messages.js
new file mode 100644
index 0000000..2d94782
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/routes/messages.js
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+ logger: Ember.inject.service('alert-messages'),
+ model: function() {
+ return this.store.peekAll('alert');
+ },
+ setupController: function(controller, model) {
+ this._super(controller, model);
+ this.get('logger').clearMessages();
+ controller.set('isExpanded', true);
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/routes/messages/message.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/routes/messages/message.js b/contrib/views/files/src/main/resources/ui/app/routes/messages/message.js
new file mode 100644
index 0000000..84be53b
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/routes/messages/message.js
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+ model: function(params) {
+ return this.store.peekRecord('alert', params.message_id);
+ },
+
+ setupController: function(controller, model) {
+ this._super(controller, model);
+ var messagesController = this.controllerFor('messages');
+ messagesController.set('isExpanded', false);
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/serializers/file.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/serializers/file.js b/contrib/views/files/src/main/resources/ui/app/serializers/file.js
new file mode 100644
index 0000000..3edc933
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/serializers/file.js
@@ -0,0 +1,23 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+
+export default DS.RESTSerializer.extend({
+ primaryKey: 'path'
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/alert-messages.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/alert-messages.js b/contrib/views/files/src/main/resources/ui/app/services/alert-messages.js
new file mode 100644
index 0000000..1a9c06d
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/alert-messages.js
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+
+/**
+ Shows alert flash and also creates `alert` objects in store. If creation of
+ `alert` objects in store pass `options.flashOnly` as `true`. The options
+ required for creating the `alert` objects are:
+ ```
+ options.message: message field returned by the API server.
+ options.status : Status XHR request if the message is a response to XHR request. Defaults to -1.
+ options.error: Detailed error to be displayed.
+ ```
+ Options required for ember-cli-flash can also be passed in the alertOptions to override the
+ default behaviour.
+*/
+export default Ember.Service.extend({
+ flashMessages: Ember.inject.service('flash-messages'),
+ store: Ember.inject.service('store'),
+
+ success: function(message, options = {}, alertOptions = {}) {
+ this._processMessage('success', message, options, alertOptions);
+ },
+
+ warn: function(message, options = {}, alertOptions = {}) {
+ this._processMessage('warn', message, options, alertOptions);
+ },
+
+ info: function(message, options = {}, alertOptions = {}) {
+ this._processMessage('info', message, options, alertOptions);
+ },
+
+ danger: function(message, options = {}, alertOptions = {}) {
+ this._processMessage('danger', message, options, alertOptions);
+ },
+
+ clearMessages: function() {
+ this.get('flashMessages').clearMessages();
+ },
+
+ _processMessage: function(type, message, options, alertOptions) {
+ this._clearMessagesIfRequired(alertOptions);
+ let alertRecord = this._createAlert(message, type, options, alertOptions);
+ if(alertRecord) {
+ message = this._addDetailsToMessage(message, alertRecord);
+ }
+ switch (type) {
+ case 'success':
+ this.get('flashMessages').success(message, this._getOptions(alertOptions));
+ break;
+ case 'warn':
+ this.get('flashMessages').warning(message, this._getOptions(alertOptions));
+ break;
+ case 'info':
+ this.get('flashMessages').info(message, this._getOptions(alertOptions));
+ break;
+ case 'danger':
+ this.get('flashMessages').danger(message, this._getOptions(alertOptions));
+ }
+ },
+
+ _addDetailsToMessage: function(message, record) {
+ let id = record.get('id');
+ let suffix = `<a href="#/messages/${id}">(details)</a>`;
+ return message + " " + suffix;
+ },
+
+ _createAlert: function(message, type, options, alertOptions) {
+ var data = {};
+ data.message = message;
+ data.responseMessage = options.message || '';
+ data.id = this._getNextAlertId();
+ data.type = type;
+ data.status = options.status || -1;
+ data.trace = this._getDetailedError(options.trace);
+ delete options.status;
+ delete options.error;
+
+ if(alertOptions.flashOnly === true) {
+ return;
+ }
+
+ return this.get('store').createRecord('alert', data);
+ },
+
+ _getDetailedError: function(error) {
+ return error || '';
+ },
+
+ _getOptions: function(options = {}) {
+ var defaultOptions = {
+ priority: 100,
+ showProgress: true,
+ timeout: 6000
+ };
+ return Ember.merge(defaultOptions, options);
+ },
+
+ _getNextAlertId: function() {
+ return this.get('store').peekAll('alert').get('length') + 1;
+ },
+
+ _clearMessagesIfRequired: function(options = {}) {
+ var stackMessages = options.stackMessages || false;
+ if(stackMessages !== true) {
+ this.clearMessages();
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/file-copy.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/file-copy.js b/contrib/views/files/src/main/resources/ui/app/services/file-copy.js
new file mode 100644
index 0000000..7193177
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/file-copy.js
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FileOperationMixin from '../mixins/file-operation';
+
+export default Ember.Service.extend(FileOperationMixin, {
+ logger: Ember.inject.service('alert-messages'),
+
+ // Returns a promise for the operation. Upon sucess or error, this also
+ // appropriately sends error messages.
+
+ copy: function (srcPath, destName) {
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ var adapter = this.get('store').adapterFor('file');
+ var baseURL = adapter.buildURL('file');
+ var moveUrl = baseURL.substring(0, baseURL.lastIndexOf('/')) + "/copy";
+ var data = {sourcePaths: srcPath, destinationPath: destName};
+ adapter.ajax(moveUrl, "POST", {data: data}).then((response) => {
+ this.get('logger').success(`Successfully copied to ${destName}.`, {}, {flashOnly: true});
+ resolve(response);
+ }, (responseError) => {
+ var error = this.extractError(responseError);
+ this.get('logger').danger(`Failed to copy to ${destName}`, error);
+ reject(error);
+ });
+ });
+ },
+
+ _isDestinationPathExists(destinationPath) {
+ return this.get('store').peekAll('file').isAny('path', destinationPath);
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/file-move.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/file-move.js b/contrib/views/files/src/main/resources/ui/app/services/file-move.js
new file mode 100644
index 0000000..859f04c
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/file-move.js
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FileOperationMixin from '../mixins/file-operation';
+
+export default Ember.Service.extend(FileOperationMixin, {
+ logger: Ember.inject.service('alert-messages'),
+
+ // Returns a promise for the operation. Upon sucess or error, this also
+ // appropriately sends error messages.
+ move: function(srcPath, destName ) {
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ var adapter = this.get('store').adapterFor('file');
+ var baseURL = adapter.buildURL('file');
+ var moveUrl = baseURL.substring(0, baseURL.lastIndexOf('/')) + "/move";
+ var data = {sourcePaths: srcPath, destinationPath: destName};
+ adapter.ajax(moveUrl, "POST", {data: data}).then((response) => {
+ this.get('logger').success(`Successfully moved to ${destName}.`, {}, {flashOnly: true});
+ resolve(response);
+ }, (responseError) => {
+ var error = this.extractError(responseError);
+ this.get('logger').danger(`Failed to move to ${destName}`, error);
+ reject(error);
+ });
+ });
+ },
+
+ _isDestinationPathExists(destinationPath) {
+ return this.get('store').peekAll('file').isAny('path', destinationPath);
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/file-operation.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/file-operation.js b/contrib/views/files/src/main/resources/ui/app/services/file-operation.js
new file mode 100644
index 0000000..abb3000
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/file-operation.js
@@ -0,0 +1,199 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FileOperationMixin from '../mixins/file-operation';
+
+export default Ember.Service.extend(FileOperationMixin, {
+ logger: Ember.inject.service('alert-messages'),
+ chmod: function (path, permission) {
+ var adapter = this.get('store').adapterFor('file');
+ var data = {mode: permission, path: path};
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ adapter.ajax(this._getFileOperationUrl('chmod'), "POST", {data: data}).then(
+ (response) => {
+ this.get('logger').success(`Successfully changed permission of ${path}`, {}, {flashOnly: false});
+ return resolve(response);
+ }, (responseError) => {
+ var error = this.extractError(responseError);
+ this.get('logger').danger(`Failed to modify permission of ${path}`, error);
+ return reject(error);
+ });
+ });
+ },
+
+ createNewFolder: function (srcPath, folderName) {
+ var path = (srcPath === '/') ? '' : srcPath;
+
+ if (folderName.slice(0, 1) === '/') {
+ folderName = folderName.slice(0, folderName.length);
+ }
+ var adapter = this.get('store').adapterFor('file');
+ var data = {path: `${path}/${folderName}`};
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ adapter.ajax(this._getFileOperationUrl('mkdir'), "PUT", {data: data}).then(
+ (response) => {
+ this.get('logger').success(`Successfully created <strong>${path}/${folderName}`, {flashOnly: true});
+ return resolve(response);
+ }, (responseError) => {
+ var error = this.extractError(responseError);
+ this.get('logger').danger(`Failed to create ${path}/${folderName}`, error);
+ return reject(error);
+ });
+ });
+ },
+
+ deletePaths: function (paths, deletePermanently = false) {
+ var opsUrl;
+ if (deletePermanently) {
+ opsUrl = this._getFileOperationUrl('remove');
+ } else {
+ opsUrl = this._getFileOperationUrl('moveToTrash');
+ }
+ var data = {
+ paths: paths.map((path) => {
+ return {path: path, recursive: true};
+ })
+ };
+ var adapter = this.get('store').adapterFor('file');
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ adapter.ajax(opsUrl, "DELETE", {data: data}).then(
+ (response) => {
+ return resolve(response);
+ }, (rejectResponse) => {
+ var error = this.extractError(rejectResponse);
+ if (this.isInvalidError(error)) {
+ return reject(this._prepareUnprocessableErrorResponse(error));
+ } else {
+ return reject(Ember.merge({retry: false, unprocessable: false}, error));
+ }
+ });
+ });
+ },
+
+ listPath: function (queryPath, onlyDirectory = true) {
+ let baseUrl = this._getFileOperationUrl('listdir');
+ let url = `${baseUrl}?${queryPath}`;
+ var adapter = this.get('store').adapterFor('file');
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ adapter.ajax(url, "GET").then(
+ (response) => {
+ if (onlyDirectory) {
+ return resolve(response.files.filter((entry) => {
+ return entry.isDirectory;
+ }));
+ } else {
+ return resolve(response.files);
+ }
+ }, (responseError) => {
+ var error = this.extractError(responseError);
+ return reject(error);
+ });
+ });
+ },
+
+ movePaths: function (srcPath, destName) {
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ var adapter = this.get('store').adapterFor('file');
+ var baseURL = adapter.buildURL('file');
+ var moveUrl = baseURL.substring(0, baseURL.lastIndexOf('/')) + "/move";
+ var data = {sourcePaths: srcPath, destinationPath: destName};
+ adapter.ajax(moveUrl, "POST", {data: data}).then((response) => {
+ this.get('logger').success(`Successfully moved to ${destName}.`, {}, {flashOnly: true});
+ resolve(response);
+ }, (rejectResponse) => {
+ var error = this.extractError(rejectResponse);
+ if (this.isInvalidError(error)) {
+ return reject(this._prepareUnprocessableErrorResponse(error));
+ } else {
+ return reject(Ember.merge({retry: false, unprocessable: false}, error));
+ }
+ });
+ });
+ },
+
+ copyPaths: function (srcPath, destName) {
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ var adapter = this.get('store').adapterFor('file');
+ var baseURL = adapter.buildURL('file');
+ var moveUrl = baseURL.substring(0, baseURL.lastIndexOf('/')) + "/copy";
+ var data = {sourcePaths: srcPath, destinationPath: destName};
+ adapter.ajax(moveUrl, "POST", {data: data}).then((response) => {
+ this.get('logger').success(`Successfully copied to ${destName}.`, {}, {flashOnly: true});
+ resolve(response);
+ }, (rejectResponse) => {
+ var error = this.extractError(rejectResponse);
+ if (this.isInvalidError(error)) {
+ return reject(this._prepareUnprocessableErrorResponse(error));
+ } else {
+ return reject(Ember.merge({retry: false, unprocessable: false}, error));
+ }
+ });
+ });
+ },
+
+ _checkIfDeleteRetryIsRequired: function (error) {
+ return error.unprocessed.length >= 1;
+ },
+
+ _prepareUnprocessableErrorResponse: function (error) {
+ var response = {};
+ response.unprocessable = true;
+ if (this._checkIfDeleteRetryIsRequired(error)) {
+ response.retry = true;
+ response.failed = error.failed[0];
+ response.message = error.message;
+ response.unprocessed = error.unprocessed;
+ } else {
+ response.retry = false;
+ response.failed = error.failed[0];
+ response.message = error.message;
+ }
+
+ return response;
+ },
+
+ getHome: function () {
+ var adapter = this.get('store').adapterFor('file');
+ return adapter.ajax(this._getMiscUrl("/help/home"), "GET");
+ },
+
+ getTrash: function () {
+ var adapter = this.get('store').adapterFor('file');
+ return adapter.ajax(this._getMiscUrl("/help/trashDir"), "GET");
+ },
+
+ _getMiscUrl: function (segment) {
+ var urlFragments = this._getBaseURLFragments();
+ return urlFragments.slice(0, urlFragments.length - 2).join('/') + segment;
+ },
+
+ getUploadUrl: function () {
+ return this._getMiscUrl("/upload");
+ },
+
+ _getFileOperationUrl: function (pathFragment) {
+ var adapter = this.get('store').adapterFor('file');
+ var baseURL = adapter.buildURL('file');
+ return baseURL.substring(0, baseURL.lastIndexOf('/')) + `/${pathFragment}`;
+ },
+
+ isExistsInCurrentPath: function (name) {
+ return this.get('store').peekAll('file').isAny('name', name);
+ }
+});
[06/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/qunit.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/qunit.js b/contrib/views/files/src/main/resources/ui/app/assets/javascripts/qunit.js
deleted file mode 100644
index 474cfe5..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/qunit.js
+++ /dev/null
@@ -1,2495 +0,0 @@
-/*!
- * QUnit 1.15.0
- * http://qunitjs.com/
- *
- * Copyright 2014 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2014-08-08T16:00Z
- */
-
-(function( window ) {
-
-var QUnit,
- config,
- onErrorFnPrev,
- fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" ),
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty,
- // Keep a local reference to Date (GH-283)
- Date = window.Date,
- now = Date.now || function() {
- return new Date().getTime();
- },
- setTimeout = window.setTimeout,
- clearTimeout = window.clearTimeout,
- defined = {
- document: typeof window.document !== "undefined",
- setTimeout: typeof window.setTimeout !== "undefined",
- sessionStorage: (function() {
- var x = "qunit-test-string";
- try {
- sessionStorage.setItem( x, x );
- sessionStorage.removeItem( x );
- return true;
- } catch ( e ) {
- return false;
- }
- }())
- },
- /**
- * Provides a normalized error string, correcting an issue
- * with IE 7 (and prior) where Error.prototype.toString is
- * not properly implemented
- *
- * Based on http://es5.github.com/#x15.11.4.4
- *
- * @param {String|Error} error
- * @return {String} error message
- */
- errorString = function( error ) {
- var name, message,
- errorString = error.toString();
- if ( errorString.substring( 0, 7 ) === "[object" ) {
- name = error.name ? error.name.toString() : "Error";
- message = error.message ? error.message.toString() : "";
- if ( name && message ) {
- return name + ": " + message;
- } else if ( name ) {
- return name;
- } else if ( message ) {
- return message;
- } else {
- return "Error";
- }
- } else {
- return errorString;
- }
- },
- /**
- * Makes a clone of an object using only Array or Object as base,
- * and copies over the own enumerable properties.
- *
- * @param {Object} obj
- * @return {Object} New object with only the own properties (recursively).
- */
- objectValues = function( obj ) {
- var key, val,
- vals = QUnit.is( "array", obj ) ? [] : {};
- for ( key in obj ) {
- if ( hasOwn.call( obj, key ) ) {
- val = obj[ key ];
- vals[ key ] = val === Object( val ) ? objectValues( val ) : val;
- }
- }
- return vals;
- };
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
- // call on start of module test to prepend name to all tests
- module: function( name, testEnvironment ) {
- config.currentModule = name;
- config.currentModuleTestEnvironment = testEnvironment;
- config.modules[ name ] = true;
- },
-
- asyncTest: function( testName, expected, callback ) {
- if ( arguments.length === 2 ) {
- callback = expected;
- expected = null;
- }
-
- QUnit.test( testName, expected, callback, true );
- },
-
- test: function( testName, expected, callback, async ) {
- var test;
-
- if ( arguments.length === 2 ) {
- callback = expected;
- expected = null;
- }
-
- test = new Test({
- testName: testName,
- expected: expected,
- async: async,
- callback: callback,
- module: config.currentModule,
- moduleTestEnvironment: config.currentModuleTestEnvironment,
- stack: sourceFromStacktrace( 2 )
- });
-
- if ( !validTest( test ) ) {
- return;
- }
-
- test.queue();
- },
-
- start: function( count ) {
- var message;
-
- // QUnit hasn't been initialized yet.
- // Note: RequireJS (et al) may delay onLoad
- if ( config.semaphore === undefined ) {
- QUnit.begin(function() {
- // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
- setTimeout(function() {
- QUnit.start( count );
- });
- });
- return;
- }
-
- config.semaphore -= count || 1;
- // don't start until equal number of stop-calls
- if ( config.semaphore > 0 ) {
- return;
- }
-
- // Set the starting time when the first test is run
- QUnit.config.started = QUnit.config.started || now();
- // ignore if start is called more often then stop
- if ( config.semaphore < 0 ) {
- config.semaphore = 0;
-
- message = "Called start() while already started (QUnit.config.semaphore was 0 already)";
-
- if ( config.current ) {
- QUnit.pushFailure( message, sourceFromStacktrace( 2 ) );
- } else {
- throw new Error( message );
- }
-
- return;
- }
- // A slight delay, to avoid any current callbacks
- if ( defined.setTimeout ) {
- setTimeout(function() {
- if ( config.semaphore > 0 ) {
- return;
- }
- if ( config.timeout ) {
- clearTimeout( config.timeout );
- }
-
- config.blocking = false;
- process( true );
- }, 13 );
- } else {
- config.blocking = false;
- process( true );
- }
- },
-
- stop: function( count ) {
- config.semaphore += count || 1;
- config.blocking = true;
-
- if ( config.testTimeout && defined.setTimeout ) {
- clearTimeout( config.timeout );
- config.timeout = setTimeout(function() {
- QUnit.ok( false, "Test timed out" );
- config.semaphore = 1;
- QUnit.start();
- }, config.testTimeout );
- }
- }
-};
-
-// We use the prototype to distinguish between properties that should
-// be exposed as globals (and in exports) and those that shouldn't
-(function() {
- function F() {}
- F.prototype = QUnit;
- QUnit = new F();
-
- // Make F QUnit's constructor so that we can add to the prototype later
- QUnit.constructor = F;
-}());
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
- // The queue of tests to run
- queue: [],
-
- // block until document ready
- blocking: true,
-
- // when enabled, show only failing tests
- // gets persisted through sessionStorage and can be changed in UI via checkbox
- hidepassed: false,
-
- // by default, run previously failed tests first
- // very useful in combination with "Hide passed tests" checked
- reorder: true,
-
- // by default, modify document.title when suite is done
- altertitle: true,
-
- // by default, scroll to top of the page when suite is done
- scrolltop: true,
-
- // when enabled, all tests must call expect()
- requireExpects: false,
-
- // add checkboxes that are persisted in the query-string
- // when enabled, the id is set to `true` as a `QUnit.config` property
- urlConfig: [
- {
- id: "noglobals",
- label: "Check for Globals",
- tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
- },
- {
- id: "notrycatch",
- label: "No try-catch",
- tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
- }
- ],
-
- // Set of all modules.
- modules: {},
-
- callbacks: {}
-};
-
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
- var i, current,
- location = window.location || { search: "", protocol: "file:" },
- params = location.search.slice( 1 ).split( "&" ),
- length = params.length,
- urlParams = {};
-
- if ( params[ 0 ] ) {
- for ( i = 0; i < length; i++ ) {
- current = params[ i ].split( "=" );
- current[ 0 ] = decodeURIComponent( current[ 0 ] );
-
- // allow just a key to turn on a flag, e.g., test.html?noglobals
- current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
- if ( urlParams[ current[ 0 ] ] ) {
- urlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] );
- } else {
- urlParams[ current[ 0 ] ] = current[ 1 ];
- }
- }
- }
-
- QUnit.urlParams = urlParams;
-
- // String search anywhere in moduleName+testName
- config.filter = urlParams.filter;
-
- // Exact match of the module name
- config.module = urlParams.module;
-
- config.testNumber = [];
- if ( urlParams.testNumber ) {
-
- // Ensure that urlParams.testNumber is an array
- urlParams.testNumber = [].concat( urlParams.testNumber );
- for ( i = 0; i < urlParams.testNumber.length; i++ ) {
- current = urlParams.testNumber[ i ];
- config.testNumber.push( parseInt( current, 10 ) );
- }
- }
-
- // Figure out if we're running the tests from a server or not
- QUnit.isLocal = location.protocol === "file:";
-}());
-
-extend( QUnit, {
-
- config: config,
-
- // Safe object type checking
- is: function( type, obj ) {
- return QUnit.objectType( obj ) === type;
- },
-
- objectType: function( obj ) {
- if ( typeof obj === "undefined" ) {
- return "undefined";
- }
-
- // Consider: typeof null === object
- if ( obj === null ) {
- return "null";
- }
-
- var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ),
- type = match && match[ 1 ] || "";
-
- switch ( type ) {
- case "Number":
- if ( isNaN( obj ) ) {
- return "nan";
- }
- return "number";
- case "String":
- case "Boolean":
- case "Array":
- case "Date":
- case "RegExp":
- case "Function":
- return type.toLowerCase();
- }
- if ( typeof obj === "object" ) {
- return "object";
- }
- return undefined;
- },
-
- url: function( params ) {
- params = extend( extend( {}, QUnit.urlParams ), params );
- var key,
- querystring = "?";
-
- for ( key in params ) {
- if ( hasOwn.call( params, key ) ) {
- querystring += encodeURIComponent( key ) + "=" +
- encodeURIComponent( params[ key ] ) + "&";
- }
- }
- return window.location.protocol + "//" + window.location.host +
- window.location.pathname + querystring.slice( 0, -1 );
- },
-
- extend: extend
-});
-
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
-
- // Logging callbacks; all receive a single argument with the listed properties
- // run test/logs.html for any related changes
- begin: registerLoggingCallback( "begin" ),
-
- // done: { failed, passed, total, runtime }
- done: registerLoggingCallback( "done" ),
-
- // log: { result, actual, expected, message }
- log: registerLoggingCallback( "log" ),
-
- // testStart: { name }
- testStart: registerLoggingCallback( "testStart" ),
-
- // testDone: { name, failed, passed, total, runtime }
- testDone: registerLoggingCallback( "testDone" ),
-
- // moduleStart: { name }
- moduleStart: registerLoggingCallback( "moduleStart" ),
-
- // moduleDone: { name, failed, passed, total }
- moduleDone: registerLoggingCallback( "moduleDone" )
-});
-
-QUnit.load = function() {
- runLoggingCallbacks( "begin", {
- totalTests: Test.count
- });
-
- // Initialize the configuration options
- extend( config, {
- stats: { all: 0, bad: 0 },
- moduleStats: { all: 0, bad: 0 },
- started: 0,
- updateRate: 1000,
- autostart: true,
- filter: "",
- semaphore: 1
- }, true );
-
- config.blocking = false;
-
- if ( config.autostart ) {
- QUnit.start();
- }
-};
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function( error, filePath, linerNr ) {
- var ret = false;
- if ( onErrorFnPrev ) {
- ret = onErrorFnPrev( error, filePath, linerNr );
- }
-
- // Treat return value as window.onerror itself does,
- // Only do our handling if not suppressed.
- if ( ret !== true ) {
- if ( QUnit.config.current ) {
- if ( QUnit.config.current.ignoreGlobalErrors ) {
- return true;
- }
- QUnit.pushFailure( error, filePath + ":" + linerNr );
- } else {
- QUnit.test( "global failure", extend(function() {
- QUnit.pushFailure( error, filePath + ":" + linerNr );
- }, { validTest: validTest } ) );
- }
- return false;
- }
-
- return ret;
-};
-
-function done() {
- config.autorun = true;
-
- // Log the last module results
- if ( config.previousModule ) {
- runLoggingCallbacks( "moduleDone", {
- name: config.previousModule,
- failed: config.moduleStats.bad,
- passed: config.moduleStats.all - config.moduleStats.bad,
- total: config.moduleStats.all
- });
- }
- delete config.previousModule;
-
- var runtime = now() - config.started,
- passed = config.stats.all - config.stats.bad;
-
- runLoggingCallbacks( "done", {
- failed: config.stats.bad,
- passed: passed,
- total: config.stats.all,
- runtime: runtime
- });
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
- var include,
- filter = config.filter && config.filter.toLowerCase(),
- module = config.module && config.module.toLowerCase(),
- fullName = ( test.module + ": " + test.testName ).toLowerCase();
-
- // Internally-generated tests are always valid
- if ( test.callback && test.callback.validTest === validTest ) {
- delete test.callback.validTest;
- return true;
- }
-
- if ( config.testNumber.length > 0 ) {
- if ( inArray( test.testNumber, config.testNumber ) < 0 ) {
- return false;
- }
- }
-
- if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
- return false;
- }
-
- if ( !filter ) {
- return true;
- }
-
- include = filter.charAt( 0 ) !== "!";
- if ( !include ) {
- filter = filter.slice( 1 );
- }
-
- // If the filter matches, we need to honour include
- if ( fullName.indexOf( filter ) !== -1 ) {
- return include;
- }
-
- // Otherwise, do the opposite
- return !include;
-}
-
-// Doesn't support IE6 to IE9
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
- offset = offset === undefined ? 4 : offset;
-
- var stack, include, i;
-
- if ( e.stacktrace ) {
-
- // Opera 12.x
- return e.stacktrace.split( "\n" )[ offset + 3 ];
- } else if ( e.stack ) {
-
- // Firefox, Chrome, Safari 6+, IE10+, PhantomJS and Node
- stack = e.stack.split( "\n" );
- if ( /^error$/i.test( stack[ 0 ] ) ) {
- stack.shift();
- }
- if ( fileName ) {
- include = [];
- for ( i = offset; i < stack.length; i++ ) {
- if ( stack[ i ].indexOf( fileName ) !== -1 ) {
- break;
- }
- include.push( stack[ i ] );
- }
- if ( include.length ) {
- return include.join( "\n" );
- }
- }
- return stack[ offset ];
- } else if ( e.sourceURL ) {
-
- // Safari < 6
- // exclude useless self-reference for generated Error objects
- if ( /qunit.js$/.test( e.sourceURL ) ) {
- return;
- }
-
- // for actual exceptions, this is useful
- return e.sourceURL + ":" + e.line;
- }
-}
-function sourceFromStacktrace( offset ) {
- try {
- throw new Error();
- } catch ( e ) {
- return extractStacktrace( e, offset );
- }
-}
-
-function synchronize( callback, last ) {
- config.queue.push( callback );
-
- if ( config.autorun && !config.blocking ) {
- process( last );
- }
-}
-
-function process( last ) {
- function next() {
- process( last );
- }
- var start = now();
- config.depth = config.depth ? config.depth + 1 : 1;
-
- while ( config.queue.length && !config.blocking ) {
- if ( !defined.setTimeout || config.updateRate <= 0 || ( ( now() - start ) < config.updateRate ) ) {
- config.queue.shift()();
- } else {
- setTimeout( next, 13 );
- break;
- }
- }
- config.depth--;
- if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
- done();
- }
-}
-
-function saveGlobal() {
- config.pollution = [];
-
- if ( config.noglobals ) {
- for ( var key in window ) {
- if ( hasOwn.call( window, key ) ) {
- // in Opera sometimes DOM element ids show up here, ignore them
- if ( /^qunit-test-output/.test( key ) ) {
- continue;
- }
- config.pollution.push( key );
- }
- }
- }
-}
-
-function checkPollution() {
- var newGlobals,
- deletedGlobals,
- old = config.pollution;
-
- saveGlobal();
-
- newGlobals = diff( config.pollution, old );
- if ( newGlobals.length > 0 ) {
- QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) );
- }
-
- deletedGlobals = diff( old, config.pollution );
- if ( deletedGlobals.length > 0 ) {
- QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) );
- }
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
- var i, j,
- result = a.slice();
-
- for ( i = 0; i < result.length; i++ ) {
- for ( j = 0; j < b.length; j++ ) {
- if ( result[ i ] === b[ j ] ) {
- result.splice( i, 1 );
- i--;
- break;
- }
- }
- }
- return result;
-}
-
-function extend( a, b, undefOnly ) {
- for ( var prop in b ) {
- if ( hasOwn.call( b, prop ) ) {
-
- // Avoid "Member not found" error in IE8 caused by messing with window.constructor
- if ( !( prop === "constructor" && a === window ) ) {
- if ( b[ prop ] === undefined ) {
- delete a[ prop ];
- } else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) {
- a[ prop ] = b[ prop ];
- }
- }
- }
- }
-
- return a;
-}
-
-function registerLoggingCallback( key ) {
-
- // Initialize key collection of logging callback
- if ( QUnit.objectType( config.callbacks[ key ] ) === "undefined" ) {
- config.callbacks[ key ] = [];
- }
-
- return function( callback ) {
- config.callbacks[ key ].push( callback );
- };
-}
-
-function runLoggingCallbacks( key, args ) {
- var i, l, callbacks;
-
- callbacks = config.callbacks[ key ];
- for ( i = 0, l = callbacks.length; i < l; i++ ) {
- callbacks[ i ]( args );
- }
-}
-
-// from jquery.js
-function inArray( elem, array ) {
- if ( array.indexOf ) {
- return array.indexOf( elem );
- }
-
- for ( var i = 0, length = array.length; i < length; i++ ) {
- if ( array[ i ] === elem ) {
- return i;
- }
- }
-
- return -1;
-}
-
-function Test( settings ) {
- extend( this, settings );
- this.assert = new Assert( this );
- this.assertions = [];
- this.testNumber = ++Test.count;
-}
-
-Test.count = 0;
-
-Test.prototype = {
- setup: function() {
- if (
-
- // Emit moduleStart when we're switching from one module to another
- this.module !== config.previousModule ||
-
- // They could be equal (both undefined) but if the previousModule property doesn't
- // yet exist it means this is the first test in a suite that isn't wrapped in a
- // module, in which case we'll just emit a moduleStart event for 'undefined'.
- // Without this, reporters can get testStart before moduleStart which is a problem.
- !hasOwn.call( config, "previousModule" )
- ) {
- if ( hasOwn.call( config, "previousModule" ) ) {
- runLoggingCallbacks( "moduleDone", {
- name: config.previousModule,
- failed: config.moduleStats.bad,
- passed: config.moduleStats.all - config.moduleStats.bad,
- total: config.moduleStats.all
- });
- }
- config.previousModule = this.module;
- config.moduleStats = { all: 0, bad: 0 };
- runLoggingCallbacks( "moduleStart", {
- name: this.module
- });
- }
-
- config.current = this;
-
- this.testEnvironment = extend({
- setup: function() {},
- teardown: function() {}
- }, this.moduleTestEnvironment );
-
- this.started = now();
- runLoggingCallbacks( "testStart", {
- name: this.testName,
- module: this.module,
- testNumber: this.testNumber
- });
-
- if ( !config.pollution ) {
- saveGlobal();
- }
- if ( config.notrycatch ) {
- this.testEnvironment.setup.call( this.testEnvironment, this.assert );
- return;
- }
- try {
- this.testEnvironment.setup.call( this.testEnvironment, this.assert );
- } catch ( e ) {
- this.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
- }
- },
- run: function() {
- config.current = this;
-
- if ( this.async ) {
- QUnit.stop();
- }
-
- this.callbackStarted = now();
-
- if ( config.notrycatch ) {
- this.callback.call( this.testEnvironment, this.assert );
- this.callbackRuntime = now() - this.callbackStarted;
- return;
- }
-
- try {
- this.callback.call( this.testEnvironment, this.assert );
- this.callbackRuntime = now() - this.callbackStarted;
- } catch ( e ) {
- this.callbackRuntime = now() - this.callbackStarted;
-
- this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
-
- // else next test will carry the responsibility
- saveGlobal();
-
- // Restart the tests if they're blocking
- if ( config.blocking ) {
- QUnit.start();
- }
- }
- },
- teardown: function() {
- config.current = this;
- if ( config.notrycatch ) {
- if ( typeof this.callbackRuntime === "undefined" ) {
- this.callbackRuntime = now() - this.callbackStarted;
- }
- this.testEnvironment.teardown.call( this.testEnvironment, this.assert );
- return;
- } else {
- try {
- this.testEnvironment.teardown.call( this.testEnvironment, this.assert );
- } catch ( e ) {
- this.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
- }
- }
- checkPollution();
- },
- finish: function() {
- config.current = this;
- if ( config.requireExpects && this.expected === null ) {
- this.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
- } else if ( this.expected !== null && this.expected !== this.assertions.length ) {
- this.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
- } else if ( this.expected === null && !this.assertions.length ) {
- this.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
- }
-
- var i,
- bad = 0;
-
- this.runtime = now() - this.started;
- config.stats.all += this.assertions.length;
- config.moduleStats.all += this.assertions.length;
-
- for ( i = 0; i < this.assertions.length; i++ ) {
- if ( !this.assertions[ i ].result ) {
- bad++;
- config.stats.bad++;
- config.moduleStats.bad++;
- }
- }
-
- runLoggingCallbacks( "testDone", {
- name: this.testName,
- module: this.module,
- failed: bad,
- passed: this.assertions.length - bad,
- total: this.assertions.length,
- runtime: this.runtime,
-
- // HTML Reporter use
- assertions: this.assertions,
- testNumber: this.testNumber,
-
- // DEPRECATED: this property will be removed in 2.0.0, use runtime instead
- duration: this.runtime
- });
-
- config.current = undefined;
- },
-
- queue: function() {
- var bad,
- test = this;
-
- function run() {
- // each of these can by async
- synchronize(function() {
- test.setup();
- });
- synchronize(function() {
- test.run();
- });
- synchronize(function() {
- test.teardown();
- });
- synchronize(function() {
- test.finish();
- });
- }
-
- // `bad` initialized at top of scope
- // defer when previous test run passed, if storage is available
- bad = QUnit.config.reorder && defined.sessionStorage &&
- +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
-
- if ( bad ) {
- run();
- } else {
- synchronize( run, true );
- }
- },
-
- push: function( result, actual, expected, message ) {
- var source,
- details = {
- module: this.module,
- name: this.testName,
- result: result,
- message: message,
- actual: actual,
- expected: expected,
- testNumber: this.testNumber
- };
-
- if ( !result ) {
- source = sourceFromStacktrace();
-
- if ( source ) {
- details.source = source;
- }
- }
-
- runLoggingCallbacks( "log", details );
-
- this.assertions.push({
- result: !!result,
- message: message
- });
- },
-
- pushFailure: function( message, source, actual ) {
- if ( !this instanceof Test ) {
- throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace( 2 ) );
- }
-
- var details = {
- module: this.module,
- name: this.testName,
- result: false,
- message: message || "error",
- actual: actual || null,
- testNumber: this.testNumber
- };
-
- if ( source ) {
- details.source = source;
- }
-
- runLoggingCallbacks( "log", details );
-
- this.assertions.push({
- result: false,
- message: message
- });
- }
-};
-
-QUnit.pushFailure = function() {
- if ( !QUnit.config.current ) {
- throw new Error( "pushFailure() assertion outside test context, in " + sourceFromStacktrace( 2 ) );
- }
-
- // Gets current test obj
- var currentTest = QUnit.config.current.assert.test;
-
- return currentTest.pushFailure.apply( currentTest, arguments );
-};
-
-function Assert( testContext ) {
- this.test = testContext;
-}
-
-// Assert helpers
-QUnit.assert = Assert.prototype = {
-
- // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
- expect: function( asserts ) {
- if ( arguments.length === 1 ) {
- this.test.expected = asserts;
- } else {
- return this.test.expected;
- }
- },
-
- // Exports test.push() to the user API
- push: function() {
- var assert = this;
-
- // Backwards compatibility fix.
- // Allows the direct use of global exported assertions and QUnit.assert.*
- // Although, it's use is not recommended as it can leak assertions
- // to other tests from async tests, because we only get a reference to the current test,
- // not exactly the test where assertion were intended to be called.
- if ( !QUnit.config.current ) {
- throw new Error( "assertion outside test context, in " + sourceFromStacktrace( 2 ) );
- }
- if ( !( assert instanceof Assert ) ) {
- assert = QUnit.config.current.assert;
- }
- return assert.test.push.apply( assert.test, arguments );
- },
-
- /**
- * Asserts rough true-ish result.
- * @name ok
- * @function
- * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
- */
- ok: function( result, message ) {
- message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " +
- QUnit.dump.parse( result ) );
- if ( !!result ) {
- this.push( true, result, true, message );
- } else {
- this.test.pushFailure( message, null, result );
- }
- },
-
- /**
- * Assert that the first two arguments are equal, with an optional message.
- * Prints out both actual and expected values.
- * @name equal
- * @function
- * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
- */
- equal: function( actual, expected, message ) {
- /*jshint eqeqeq:false */
- this.push( expected == actual, actual, expected, message );
- },
-
- /**
- * @name notEqual
- * @function
- */
- notEqual: function( actual, expected, message ) {
- /*jshint eqeqeq:false */
- this.push( expected != actual, actual, expected, message );
- },
-
- /**
- * @name propEqual
- * @function
- */
- propEqual: function( actual, expected, message ) {
- actual = objectValues( actual );
- expected = objectValues( expected );
- this.push( QUnit.equiv( actual, expected ), actual, expected, message );
- },
-
- /**
- * @name notPropEqual
- * @function
- */
- notPropEqual: function( actual, expected, message ) {
- actual = objectValues( actual );
- expected = objectValues( expected );
- this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
- },
-
- /**
- * @name deepEqual
- * @function
- */
- deepEqual: function( actual, expected, message ) {
- this.push( QUnit.equiv( actual, expected ), actual, expected, message );
- },
-
- /**
- * @name notDeepEqual
- * @function
- */
- notDeepEqual: function( actual, expected, message ) {
- this.push( !QUnit.equiv( actual, expected ), actual, expected, message );
- },
-
- /**
- * @name strictEqual
- * @function
- */
- strictEqual: function( actual, expected, message ) {
- this.push( expected === actual, actual, expected, message );
- },
-
- /**
- * @name notStrictEqual
- * @function
- */
- notStrictEqual: function( actual, expected, message ) {
- this.push( expected !== actual, actual, expected, message );
- },
-
- "throws": function( block, expected, message ) {
- var actual, expectedType,
- expectedOutput = expected,
- ok = false;
-
- // 'expected' is optional unless doing string comparison
- if ( message == null && typeof expected === "string" ) {
- message = expected;
- expected = null;
- }
-
- this.test.ignoreGlobalErrors = true;
- try {
- block.call( this.test.testEnvironment );
- } catch (e) {
- actual = e;
- }
- this.test.ignoreGlobalErrors = false;
-
- if ( actual ) {
- expectedType = QUnit.objectType( expected );
-
- // we don't want to validate thrown error
- if ( !expected ) {
- ok = true;
- expectedOutput = null;
-
- // expected is a regexp
- } else if ( expectedType === "regexp" ) {
- ok = expected.test( errorString( actual ) );
-
- // expected is a string
- } else if ( expectedType === "string" ) {
- ok = expected === errorString( actual );
-
- // expected is a constructor, maybe an Error constructor
- } else if ( expectedType === "function" && actual instanceof expected ) {
- ok = true;
-
- // expected is an Error object
- } else if ( expectedType === "object" ) {
- ok = actual instanceof expected.constructor &&
- actual.name === expected.name &&
- actual.message === expected.message;
-
- // expected is a validation function which returns true if validation passed
- } else if ( expectedType === "function" && expected.call( {}, actual ) === true ) {
- expectedOutput = null;
- ok = true;
- }
-
- this.push( ok, actual, expectedOutput, message );
- } else {
- this.test.pushFailure( message, null, "No exception was thrown." );
- }
- }
-};
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <pr...@gmail.com>
-QUnit.equiv = (function() {
-
- // Call the o related callback with the given arguments.
- function bindCallbacks( o, callbacks, args ) {
- var prop = QUnit.objectType( o );
- if ( prop ) {
- if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
- return callbacks[ prop ].apply( callbacks, args );
- } else {
- return callbacks[ prop ]; // or undefined
- }
- }
- }
-
- // the real equiv function
- var innerEquiv,
-
- // stack to decide between skip/abort functions
- callers = [],
-
- // stack to avoiding loops from circular referencing
- parents = [],
- parentsB = [],
-
- getProto = Object.getPrototypeOf || function( obj ) {
- /* jshint camelcase: false, proto: true */
- return obj.__proto__;
- },
- callbacks = (function() {
-
- // for string, boolean, number and null
- function useStrictEquality( b, a ) {
-
- /*jshint eqeqeq:false */
- if ( b instanceof a.constructor || a instanceof b.constructor ) {
-
- // to catch short annotation VS 'new' annotation of a
- // declaration
- // e.g. var i = 1;
- // var j = new Number(1);
- return a == b;
- } else {
- return a === b;
- }
- }
-
- return {
- "string": useStrictEquality,
- "boolean": useStrictEquality,
- "number": useStrictEquality,
- "null": useStrictEquality,
- "undefined": useStrictEquality,
-
- "nan": function( b ) {
- return isNaN( b );
- },
-
- "date": function( b, a ) {
- return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
- },
-
- "regexp": function( b, a ) {
- return QUnit.objectType( b ) === "regexp" &&
-
- // the regex itself
- a.source === b.source &&
-
- // and its modifiers
- a.global === b.global &&
-
- // (gmi) ...
- a.ignoreCase === b.ignoreCase &&
- a.multiline === b.multiline &&
- a.sticky === b.sticky;
- },
-
- // - skip when the property is a method of an instance (OOP)
- // - abort otherwise,
- // initial === would have catch identical references anyway
- "function": function() {
- var caller = callers[ callers.length - 1 ];
- return caller !== Object && typeof caller !== "undefined";
- },
-
- "array": function( b, a ) {
- var i, j, len, loop, aCircular, bCircular;
-
- // b could be an object literal here
- if ( QUnit.objectType( b ) !== "array" ) {
- return false;
- }
-
- len = a.length;
- if ( len !== b.length ) {
- // safe and faster
- return false;
- }
-
- // track reference to avoid circular references
- parents.push( a );
- parentsB.push( b );
- for ( i = 0; i < len; i++ ) {
- loop = false;
- for ( j = 0; j < parents.length; j++ ) {
- aCircular = parents[ j ] === a[ i ];
- bCircular = parentsB[ j ] === b[ i ];
- if ( aCircular || bCircular ) {
- if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
- loop = true;
- } else {
- parents.pop();
- parentsB.pop();
- return false;
- }
- }
- }
- if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
- parents.pop();
- parentsB.pop();
- return false;
- }
- }
- parents.pop();
- parentsB.pop();
- return true;
- },
-
- "object": function( b, a ) {
-
- /*jshint forin:false */
- var i, j, loop, aCircular, bCircular,
- // Default to true
- eq = true,
- aProperties = [],
- bProperties = [];
-
- // comparing constructors is more strict than using
- // instanceof
- if ( a.constructor !== b.constructor ) {
-
- // Allow objects with no prototype to be equivalent to
- // objects with Object as their constructor.
- if ( !( ( getProto( a ) === null && getProto( b ) === Object.prototype ) ||
- ( getProto( b ) === null && getProto( a ) === Object.prototype ) ) ) {
- return false;
- }
- }
-
- // stack constructor before traversing properties
- callers.push( a.constructor );
-
- // track reference to avoid circular references
- parents.push( a );
- parentsB.push( b );
-
- // be strict: don't ensure hasOwnProperty and go deep
- for ( i in a ) {
- loop = false;
- for ( j = 0; j < parents.length; j++ ) {
- aCircular = parents[ j ] === a[ i ];
- bCircular = parentsB[ j ] === b[ i ];
- if ( aCircular || bCircular ) {
- if ( a[ i ] === b[ i ] || aCircular && bCircular ) {
- loop = true;
- } else {
- eq = false;
- break;
- }
- }
- }
- aProperties.push( i );
- if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) {
- eq = false;
- break;
- }
- }
-
- parents.pop();
- parentsB.pop();
- callers.pop(); // unstack, we are done
-
- for ( i in b ) {
- bProperties.push( i ); // collect b's properties
- }
-
- // Ensures identical properties name
- return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
- }
- };
- }());
-
- innerEquiv = function() { // can take multiple arguments
- var args = [].slice.apply( arguments );
- if ( args.length < 2 ) {
- return true; // end transition
- }
-
- return ( (function( a, b ) {
- if ( a === b ) {
- return true; // catch the most you can
- } else if ( a === null || b === null || typeof a === "undefined" ||
- typeof b === "undefined" ||
- QUnit.objectType( a ) !== QUnit.objectType( b ) ) {
-
- // don't lose time with error prone cases
- return false;
- } else {
- return bindCallbacks( a, callbacks, [ b, a ] );
- }
-
- // apply transition with (1..n) arguments
- }( args[ 0 ], args[ 1 ] ) ) && innerEquiv.apply( this, args.splice( 1, args.length - 1 ) ) );
- };
-
- return innerEquiv;
-}());
-
-// Based on jsDump by Ariel Flesler
-// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
-QUnit.dump = (function() {
- function quote( str ) {
- return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
- }
- function literal( o ) {
- return o + "";
- }
- function join( pre, arr, post ) {
- var s = dump.separator(),
- base = dump.indent(),
- inner = dump.indent( 1 );
- if ( arr.join ) {
- arr = arr.join( "," + s + inner );
- }
- if ( !arr ) {
- return pre + post;
- }
- return [ pre, inner + arr, base + post ].join( s );
- }
- function array( arr, stack ) {
- var i = arr.length,
- ret = new Array( i );
- this.up();
- while ( i-- ) {
- ret[ i ] = this.parse( arr[ i ], undefined, stack );
- }
- this.down();
- return join( "[", ret, "]" );
- }
-
- var reName = /^function (\w+)/,
- dump = {
- // type is used mostly internally, you can fix a (custom)type in advance
- parse: function( obj, type, stack ) {
- stack = stack || [];
- var inStack, res,
- parser = this.parsers[ type || this.typeOf( obj ) ];
-
- type = typeof parser;
- inStack = inArray( obj, stack );
-
- if ( inStack !== -1 ) {
- return "recursion(" + ( inStack - stack.length ) + ")";
- }
- if ( type === "function" ) {
- stack.push( obj );
- res = parser.call( this, obj, stack );
- stack.pop();
- return res;
- }
- return ( type === "string" ) ? parser : this.parsers.error;
- },
- typeOf: function( obj ) {
- var type;
- if ( obj === null ) {
- type = "null";
- } else if ( typeof obj === "undefined" ) {
- type = "undefined";
- } else if ( QUnit.is( "regexp", obj ) ) {
- type = "regexp";
- } else if ( QUnit.is( "date", obj ) ) {
- type = "date";
- } else if ( QUnit.is( "function", obj ) ) {
- type = "function";
- } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
- type = "window";
- } else if ( obj.nodeType === 9 ) {
- type = "document";
- } else if ( obj.nodeType ) {
- type = "node";
- } else if (
-
- // native arrays
- toString.call( obj ) === "[object Array]" ||
-
- // NodeList objects
- ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null && typeof obj[ 0 ] === "undefined" ) ) )
- ) {
- type = "array";
- } else if ( obj.constructor === Error.prototype.constructor ) {
- type = "error";
- } else {
- type = typeof obj;
- }
- return type;
- },
- separator: function() {
- return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? " " : " ";
- },
- // extra can be a number, shortcut for increasing-calling-decreasing
- indent: function( extra ) {
- if ( !this.multiline ) {
- return "";
- }
- var chr = this.indentChar;
- if ( this.HTML ) {
- chr = chr.replace( /\t/g, " " ).replace( / /g, " " );
- }
- return new Array( this.depth + ( extra || 0 ) ).join( chr );
- },
- up: function( a ) {
- this.depth += a || 1;
- },
- down: function( a ) {
- this.depth -= a || 1;
- },
- setParser: function( name, parser ) {
- this.parsers[ name ] = parser;
- },
- // The next 3 are exposed so you can use them
- quote: quote,
- literal: literal,
- join: join,
- //
- depth: 1,
- // This is the list of parsers, to modify them, use dump.setParser
- parsers: {
- window: "[Window]",
- document: "[Document]",
- error: function( error ) {
- return "Error(\"" + error.message + "\")";
- },
- unknown: "[Unknown]",
- "null": "null",
- "undefined": "undefined",
- "function": function( fn ) {
- var ret = "function",
- // functions never have name in IE
- name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
-
- if ( name ) {
- ret += " " + name;
- }
- ret += "( ";
-
- ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
- return join( ret, dump.parse( fn, "functionCode" ), "}" );
- },
- array: array,
- nodelist: array,
- "arguments": array,
- object: function( map, stack ) {
- /*jshint forin:false */
- var ret = [], keys, key, val, i, nonEnumerableProperties;
- dump.up();
- keys = [];
- for ( key in map ) {
- keys.push( key );
- }
-
- // Some properties are not always enumerable on Error objects.
- nonEnumerableProperties = [ "message", "name" ];
- for ( i in nonEnumerableProperties ) {
- key = nonEnumerableProperties[ i ];
- if ( key in map && !( key in keys ) ) {
- keys.push( key );
- }
- }
- keys.sort();
- for ( i = 0; i < keys.length; i++ ) {
- key = keys[ i ];
- val = map[ key ];
- ret.push( dump.parse( key, "key" ) + ": " + dump.parse( val, undefined, stack ) );
- }
- dump.down();
- return join( "{", ret, "}" );
- },
- node: function( node ) {
- var len, i, val,
- open = dump.HTML ? "<" : "<",
- close = dump.HTML ? ">" : ">",
- tag = node.nodeName.toLowerCase(),
- ret = open + tag,
- attrs = node.attributes;
-
- if ( attrs ) {
- for ( i = 0, len = attrs.length; i < len; i++ ) {
- val = attrs[ i ].nodeValue;
-
- // IE6 includes all attributes in .attributes, even ones not explicitly set.
- // Those have values like undefined, null, 0, false, "" or "inherit".
- if ( val && val !== "inherit" ) {
- ret += " " + attrs[ i ].nodeName + "=" + dump.parse( val, "attribute" );
- }
- }
- }
- ret += close;
-
- // Show content of TextNode or CDATASection
- if ( node.nodeType === 3 || node.nodeType === 4 ) {
- ret += node.nodeValue;
- }
-
- return ret + open + "/" + tag + close;
- },
-
- // function calls it internally, it's the arguments part of the function
- functionArgs: function( fn ) {
- var args,
- l = fn.length;
-
- if ( !l ) {
- return "";
- }
-
- args = new Array( l );
- while ( l-- ) {
-
- // 97 is 'a'
- args[ l ] = String.fromCharCode( 97 + l );
- }
- return " " + args.join( ", " ) + " ";
- },
- // object calls it internally, the key part of an item in a map
- key: quote,
- // function calls it internally, it's the content of the function
- functionCode: "[code]",
- // node calls it internally, it's an html attribute value
- attribute: quote,
- string: quote,
- date: quote,
- regexp: literal,
- number: literal,
- "boolean": literal
- },
- // if true, entities are escaped ( <, >, \t, space and \n )
- HTML: false,
- // indentation unit
- indentChar: " ",
- // if true, items in a collection, are separated by a \n, else just a space.
- multiline: true
- };
-
- return dump;
-}());
-
-// back compat
-QUnit.jsDump = QUnit.dump;
-
-// For browser, export only select globals
-if ( typeof window !== "undefined" ) {
-
- // Deprecated
- // Extend assert methods to QUnit and Global scope through Backwards compatibility
- (function() {
- var i,
- assertions = Assert.prototype;
-
- function applyCurrent( current ) {
- return function() {
- var assert = new Assert( QUnit.config.current );
- current.apply( assert, arguments );
- };
- }
-
- for ( i in assertions ) {
- QUnit[ i ] = applyCurrent( assertions[ i ] );
- }
- })();
-
- (function() {
- var i, l,
- keys = [
- "test",
- "module",
- "expect",
- "asyncTest",
- "start",
- "stop",
- "ok",
- "equal",
- "notEqual",
- "propEqual",
- "notPropEqual",
- "deepEqual",
- "notDeepEqual",
- "strictEqual",
- "notStrictEqual",
- "throws"
- ];
-
- for ( i = 0, l = keys.length; i < l; i++ ) {
- window[ keys[ i ] ] = QUnit[ keys[ i ] ];
- }
- })();
-
- window.QUnit = QUnit;
-}
-
-// For CommonJS environments, export everything
-if ( typeof module !== "undefined" && module.exports ) {
- module.exports = QUnit;
-}
-
-// Get a reference to the global object, like window in browsers
-}( (function() {
- return this;
-})() ));
-
-/*istanbul ignore next */
-/*
- * Javascript Diff Algorithm
- * By John Resig (http://ejohn.org/)
- * Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- * http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
- var hasOwn = Object.prototype.hasOwnProperty;
-
- /*jshint eqeqeq:false, eqnull:true */
- function diff( o, n ) {
- var i,
- ns = {},
- os = {};
-
- for ( i = 0; i < n.length; i++ ) {
- if ( !hasOwn.call( ns, n[ i ] ) ) {
- ns[ n[ i ] ] = {
- rows: [],
- o: null
- };
- }
- ns[ n[ i ] ].rows.push( i );
- }
-
- for ( i = 0; i < o.length; i++ ) {
- if ( !hasOwn.call( os, o[ i ] ) ) {
- os[ o[ i ] ] = {
- rows: [],
- n: null
- };
- }
- os[ o[ i ] ].rows.push( i );
- }
-
- for ( i in ns ) {
- if ( hasOwn.call( ns, i ) ) {
- if ( ns[ i ].rows.length === 1 && hasOwn.call( os, i ) && os[ i ].rows.length === 1 ) {
- n[ ns[ i ].rows[ 0 ] ] = {
- text: n[ ns[ i ].rows[ 0 ] ],
- row: os[ i ].rows[ 0 ]
- };
- o[ os[ i ].rows[ 0 ] ] = {
- text: o[ os[ i ].rows[ 0 ] ],
- row: ns[ i ].rows[ 0 ]
- };
- }
- }
- }
-
- for ( i = 0; i < n.length - 1; i++ ) {
- if ( n[ i ].text != null && n[ i + 1 ].text == null && n[ i ].row + 1 < o.length && o[ n[ i ].row + 1 ].text == null &&
- n[ i + 1 ] == o[ n[ i ].row + 1 ] ) {
-
- n[ i + 1 ] = {
- text: n[ i + 1 ],
- row: n[ i ].row + 1
- };
- o[ n[ i ].row + 1 ] = {
- text: o[ n[ i ].row + 1 ],
- row: i + 1
- };
- }
- }
-
- for ( i = n.length - 1; i > 0; i-- ) {
- if ( n[ i ].text != null && n[ i - 1 ].text == null && n[ i ].row > 0 && o[ n[ i ].row - 1 ].text == null &&
- n[ i - 1 ] == o[ n[ i ].row - 1 ] ) {
-
- n[ i - 1 ] = {
- text: n[ i - 1 ],
- row: n[ i ].row - 1
- };
- o[ n[ i ].row - 1 ] = {
- text: o[ n[ i ].row - 1 ],
- row: i - 1
- };
- }
- }
-
- return {
- o: o,
- n: n
- };
- }
-
- return function( o, n ) {
- o = o.replace( /\s+$/, "" );
- n = n.replace( /\s+$/, "" );
-
- var i, pre,
- str = "",
- out = diff( o === "" ? [] : o.split( /\s+/ ), n === "" ? [] : n.split( /\s+/ ) ),
- oSpace = o.match( /\s+/g ),
- nSpace = n.match( /\s+/g );
-
- if ( oSpace == null ) {
- oSpace = [ " " ];
- } else {
- oSpace.push( " " );
- }
-
- if ( nSpace == null ) {
- nSpace = [ " " ];
- } else {
- nSpace.push( " " );
- }
-
- if ( out.n.length === 0 ) {
- for ( i = 0; i < out.o.length; i++ ) {
- str += "<del>" + out.o[ i ] + oSpace[ i ] + "</del>";
- }
- } else {
- if ( out.n[ 0 ].text == null ) {
- for ( n = 0; n < out.o.length && out.o[ n ].text == null; n++ ) {
- str += "<del>" + out.o[ n ] + oSpace[ n ] + "</del>";
- }
- }
-
- for ( i = 0; i < out.n.length; i++ ) {
- if ( out.n[ i ].text == null ) {
- str += "<ins>" + out.n[ i ] + nSpace[ i ] + "</ins>";
- } else {
-
- // `pre` initialized at top of scope
- pre = "";
-
- for ( n = out.n[ i ].row + 1; n < out.o.length && out.o[ n ].text == null; n++ ) {
- pre += "<del>" + out.o[ n ] + oSpace[ n ] + "</del>";
- }
- str += " " + out.n[ i ].text + nSpace[ i ] + pre;
- }
- }
- }
-
- return str;
- };
-}());
-
-(function() {
-
-// Deprecated QUnit.init - Ref #530
-// Re-initialize the configuration options
-QUnit.init = function() {
- var tests, banner, result, qunit,
- config = QUnit.config;
-
- config.stats = { all: 0, bad: 0 };
- config.moduleStats = { all: 0, bad: 0 };
- config.started = 0;
- config.updateRate = 1000;
- config.blocking = false;
- config.autostart = true;
- config.autorun = false;
- config.filter = "";
- config.queue = [];
- config.semaphore = 1;
-
- // Return on non-browser environments
- // This is necessary to not break on node tests
- if ( typeof window === "undefined" ) {
- return;
- }
-
- qunit = id( "qunit" );
- if ( qunit ) {
- qunit.innerHTML =
- "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
- "<h2 id='qunit-banner'></h2>" +
- "<div id='qunit-testrunner-toolbar'></div>" +
- "<h2 id='qunit-userAgent'></h2>" +
- "<ol id='qunit-tests'></ol>";
- }
-
- tests = id( "qunit-tests" );
- banner = id( "qunit-banner" );
- result = id( "qunit-testresult" );
-
- if ( tests ) {
- tests.innerHTML = "";
- }
-
- if ( banner ) {
- banner.className = "";
- }
-
- if ( result ) {
- result.parentNode.removeChild( result );
- }
-
- if ( tests ) {
- result = document.createElement( "p" );
- result.id = "qunit-testresult";
- result.className = "result";
- tests.parentNode.insertBefore( result, tests );
- result.innerHTML = "Running...<br/> ";
- }
-};
-
-// Resets the test setup. Useful for tests that modify the DOM.
-/*
-DEPRECATED: Use multiple tests instead of resetting inside a test.
-Use testStart or testDone for custom cleanup.
-This method will throw an error in 2.0, and will be removed in 2.1
-*/
-QUnit.reset = function() {
-
- // Return on non-browser environments
- // This is necessary to not break on node tests
- if ( typeof window === "undefined" ) {
- return;
- }
-
- var fixture = id( "qunit-fixture" );
- if ( fixture ) {
- fixture.innerHTML = config.fixture;
- }
-};
-
-// Don't load the HTML Reporter on non-Browser environments
-if ( typeof window === "undefined" ) {
- return;
-}
-
-var config = QUnit.config,
- hasOwn = Object.prototype.hasOwnProperty,
- defined = {
- document: typeof window.document !== "undefined",
- sessionStorage: (function() {
- var x = "qunit-test-string";
- try {
- sessionStorage.setItem( x, x );
- sessionStorage.removeItem( x );
- return true;
- } catch ( e ) {
- return false;
- }
- }())
- };
-
-/**
-* Escape text for attribute or text content.
-*/
-function escapeText( s ) {
- if ( !s ) {
- return "";
- }
- s = s + "";
-
- // Both single quotes and double quotes (for attributes)
- return s.replace( /['"<>&]/g, function( s ) {
- switch ( s ) {
- case "'":
- return "'";
- case "\"":
- return """;
- case "<":
- return "<";
- case ">":
- return ">";
- case "&":
- return "&";
- }
- });
-}
-
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
- if ( elem.addEventListener ) {
-
- // Standards-based browsers
- elem.addEventListener( type, fn, false );
- } else if ( elem.attachEvent ) {
-
- // support: IE <9
- elem.attachEvent( "on" + type, fn );
- }
-}
-
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
- var i = elems.length;
- while ( i-- ) {
- addEvent( elems[ i ], type, fn );
- }
-}
-
-function hasClass( elem, name ) {
- return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
-}
-
-function addClass( elem, name ) {
- if ( !hasClass( elem, name ) ) {
- elem.className += ( elem.className ? " " : "" ) + name;
- }
-}
-
-function toggleClass( elem, name ) {
- if ( hasClass( elem, name ) ) {
- removeClass( elem, name );
- } else {
- addClass( elem, name );
- }
-}
-
-function removeClass( elem, name ) {
- var set = " " + elem.className + " ";
-
- // Class name may appear multiple times
- while ( set.indexOf( " " + name + " " ) >= 0 ) {
- set = set.replace( " " + name + " ", " " );
- }
-
- // trim for prettiness
- elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
-}
-
-function id( name ) {
- return defined.document && document.getElementById && document.getElementById( name );
-}
-
-function getUrlConfigHtml() {
- var i, j, val,
- escaped, escapedTooltip,
- selection = false,
- len = config.urlConfig.length,
- urlConfigHtml = "";
-
- for ( i = 0; i < len; i++ ) {
- val = config.urlConfig[ i ];
- if ( typeof val === "string" ) {
- val = {
- id: val,
- label: val
- };
- }
-
- escaped = escapeText( val.id );
- escapedTooltip = escapeText( val.tooltip );
-
- config[ val.id ] = QUnit.urlParams[ val.id ];
- if ( !val.value || typeof val.value === "string" ) {
- urlConfigHtml += "<input id='qunit-urlconfig-" + escaped +
- "' name='" + escaped + "' type='checkbox'" +
- ( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
- ( config[ val.id ] ? " checked='checked'" : "" ) +
- " title='" + escapedTooltip + "'><label for='qunit-urlconfig-" + escaped +
- "' title='" + escapedTooltip + "'>" + val.label + "</label>";
- } else {
- urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
- "' title='" + escapedTooltip + "'>" + val.label +
- ": </label><select id='qunit-urlconfig-" + escaped +
- "' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
-
- if ( QUnit.is( "array", val.value ) ) {
- for ( j = 0; j < val.value.length; j++ ) {
- escaped = escapeText( val.value[ j ] );
- urlConfigHtml += "<option value='" + escaped + "'" +
- ( config[ val.id ] === val.value[ j ] ?
- ( selection = true ) && " selected='selected'" : "" ) +
- ">" + escaped + "</option>";
- }
- } else {
- for ( j in val.value ) {
- if ( hasOwn.call( val.value, j ) ) {
- urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
- ( config[ val.id ] === j ?
- ( selection = true ) && " selected='selected'" : "" ) +
- ">" + escapeText( val.value[ j ] ) + "</option>";
- }
- }
- }
- if ( config[ val.id ] && !selection ) {
- escaped = escapeText( config[ val.id ] );
- urlConfigHtml += "<option value='" + escaped +
- "' selected='selected' disabled='disabled'>" + escaped + "</option>";
- }
- urlConfigHtml += "</select>";
- }
- }
-
- return urlConfigHtml;
-}
-
-function toolbarUrlConfigContainer() {
- var urlConfigContainer = document.createElement( "span" );
-
- urlConfigContainer.innerHTML = getUrlConfigHtml();
-
- // For oldIE support:
- // * Add handlers to the individual elements instead of the container
- // * Use "click" instead of "change" for checkboxes
- // * Fallback from event.target to event.srcElement
- addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", function( event ) {
- var params = {},
- target = event.target || event.srcElement;
- params[ target.name ] = target.checked ?
- target.defaultValue || true :
- undefined;
- window.location = QUnit.url( params );
- });
- addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", function( event ) {
- var params = {},
- target = event.target || event.srcElement;
- params[ target.name ] = target.options[ target.selectedIndex ].value || undefined;
- window.location = QUnit.url( params );
- });
-
- return urlConfigContainer;
-}
-
-function getModuleNames() {
- var i,
- moduleNames = [];
-
- for ( i in config.modules ) {
- if ( config.modules.hasOwnProperty( i ) ) {
- moduleNames.push( i );
- }
- }
-
- moduleNames.sort(function( a, b ) {
- return a.localeCompare( b );
- });
-
- return moduleNames;
-}
-
-function toolbarModuleFilterHtml() {
- var i,
- moduleFilterHtml = "",
- moduleNames = getModuleNames();
-
- if ( moduleNames.length <= 1 ) {
- return false;
- }
-
- moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label>" +
- "<select id='qunit-modulefilter' name='modulefilter'><option value='' " +
- ( config.module === undefined ? "selected='selected'" : "" ) +
- ">< All Modules ></option>";
-
- for ( i = 0; i < moduleNames.length; i++ ) {
- moduleFilterHtml += "<option value='" +
- escapeText( encodeURIComponent( moduleNames[ i ] ) ) + "' " +
- ( config.module === moduleNames[ i ] ? "selected='selected'" : "" ) +
- ">" + escapeText( moduleNames[ i ] ) + "</option>";
- }
- moduleFilterHtml += "</select>";
-
- return moduleFilterHtml;
-}
-
-function toolbarModuleFilter() {
- var moduleFilter = document.createElement( "span" ),
- moduleFilterHtml = toolbarModuleFilterHtml();
-
- if ( !moduleFilterHtml ) {
- return false;
- }
-
- moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
- moduleFilter.innerHTML = moduleFilterHtml;
-
- addEvent( moduleFilter.lastChild, "change", function() {
- var selectBox = moduleFilter.getElementsByTagName( "select" )[ 0 ],
- selectedModule = decodeURIComponent( selectBox.options[ selectBox.selectedIndex ].value );
-
- window.location = QUnit.url({
- module: ( selectedModule === "" ) ? undefined : selectedModule,
-
- // Remove any existing filters
- filter: undefined,
- testNumber: undefined
- });
- });
-
- return moduleFilter;
-}
-
-function toolbarFilter() {
- var testList = id( "qunit-tests" ),
- filter = document.createElement( "input" );
-
- filter.type = "checkbox";
- filter.id = "qunit-filter-pass";
-
- addEvent( filter, "click", function() {
- if ( filter.checked ) {
- addClass( testList, "hidepass" );
- if ( defined.sessionStorage ) {
- sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
- }
- } else {
- removeClass( testList, "hidepass" );
- if ( defined.sessionStorage ) {
- sessionStorage.removeItem( "qunit-filter-passed-tests" );
- }
- }
- });
-
- if ( config.hidepassed || defined.sessionStorage &&
- sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
- filter.checked = true;
-
- addClass( testList, "hidepass" );
- }
-
- return filter;
-}
-
-function toolbarLabel() {
- var label = document.createElement( "label" );
- label.setAttribute( "for", "qunit-filter-pass" );
- label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
- label.innerHTML = "Hide passed tests";
-
- return label;
-}
-
-function appendToolbar() {
- var moduleFilter,
- toolbar = id( "qunit-testrunner-toolbar" );
-
- if ( toolbar ) {
- toolbar.appendChild( toolbarFilter() );
- toolbar.appendChild( toolbarLabel() );
- toolbar.appendChild( toolbarUrlConfigContainer() );
-
- moduleFilter = toolbarModuleFilter();
- if ( moduleFilter ) {
- toolbar.appendChild( moduleFilter );
- }
- }
-}
-
-function appendBanner() {
- var banner = id( "qunit-banner" );
-
- if ( banner ) {
- banner.className = "";
- banner.innerHTML = "<a href='" +
- QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) +
- "'>" + banner.innerHTML + "</a> ";
- }
-}
-
-function appendTestResults() {
- var tests = id( "qunit-tests" ),
- result = id( "qunit-testresult" );
-
- if ( result ) {
- result.parentNode.removeChild( result );
- }
-
- if ( tests ) {
- tests.innerHTML = "";
- result = document.createElement( "p" );
- result.id = "qunit-testresult";
- result.className = "result";
- tests.parentNode.insertBefore( result, tests );
- result.innerHTML = "Running...<br> ";
- }
-}
-
-function storeFixture() {
- var fixture = id( "qunit-fixture" );
- if ( fixture ) {
- config.fixture = fixture.innerHTML;
- }
-}
-
-function appendUserAgent() {
- var userAgent = id( "qunit-userAgent" );
- if ( userAgent ) {
- userAgent.innerHTML = navigator.userAgent;
- }
-}
-
-// HTML Reporter initialization and load
-QUnit.begin(function() {
- var qunit = id( "qunit" );
-
- if ( qunit ) {
- qunit.innerHTML =
- "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
- "<h2 id='qunit-banner'></h2>" +
- "<div id='qunit-testrunner-toolbar'></div>" +
- "<h2 id='qunit-userAgent'></h2>" +
- "<ol id='qunit-tests'></ol>";
- }
-
- appendBanner();
- appendTestResults();
- appendUserAgent();
- appendToolbar();
- storeFixture();
-});
-
-QUnit.done(function( details ) {
- var i, key,
- banner = id( "qunit-banner" ),
- tests = id( "qunit-tests" ),
- html = [
- "Tests completed in ",
- details.runtime,
- " milliseconds.<br>",
- "<span class='passed'>",
- details.passed,
- "</span> assertions of <span class='total'>",
- details.total,
- "</span> passed, <span class='failed'>",
- details.failed,
- "</span> failed."
- ].join( "" );
-
- if ( banner ) {
- banner.className = details.failed ? "qunit-fail" : "qunit-pass";
- }
-
- if ( tests ) {
- id( "qunit-testresult" ).innerHTML = html;
- }
-
- if ( config.altertitle && defined.document && document.title ) {
-
- // show ✖ for good, ✔ for bad suite result in title
- // use escape sequences in case file gets loaded with non-utf-8-charset
- document.title = [
- ( details.failed ? "\u2716" : "\u2714" ),
- document.title.replace( /^[\u2714\u2716] /i, "" )
- ].join( " " );
- }
-
- // clear own sessionStorage items if all tests passed
- if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
- for ( i = 0; i < sessionStorage.length; i++ ) {
- key = sessionStorage.key( i++ );
- if ( key.indexOf( "qunit-test-" ) === 0 ) {
- sessionStorage.removeItem( key );
- }
- }
- }
-
- // scroll back to top to show results
- if ( config.scrolltop && window.scrollTo ) {
- window.scrollTo( 0, 0 );
- }
-});
-
-function getNameHtml( name, module ) {
- var nameHtml = "";
-
- if ( module ) {
- nameHtml = "<span class='module-name'>" + escapeText( module ) + "</span>: ";
- }
-
- nameHtml += "<span class='test-name'>" + escapeText( name ) + "</span>";
-
- return nameHtml;
-}
-
-QUnit.testStart(function( details ) {
- var a, b, li, running, assertList,
- name = getNameHtml( details.name, details.module ),
- tests = id( "qunit-tests" );
-
- if ( tests ) {
- b = document.createElement( "strong" );
- b.innerHTML = name;
-
- a = document.createElement( "a" );
- a.innerHTML = "Rerun";
- a.href = QUnit.url({ testNumber: details.testNumber });
-
- li = document.createElement( "li" );
- li.appendChild( b );
- li.appendChild( a );
- li.className = "running";
- li.id = "qunit-test-output" + details.testNumber;
-
- assertList = document.createElement( "ol" );
- assertList.className = "qunit-assert-list";
-
- li.appendChild( assertList );
-
- tests.appendChild( li );
- }
-
- running = id( "qunit-testresult" );
- if ( running ) {
- running.innerHTML = "Running: <br>" + name;
- }
-
-});
-
-QUnit.log(function( details ) {
- var assertList, assertLi,
- message, expected, actual,
- testItem = id( "qunit-test-output" + details.testNumber );
-
- if ( !testItem ) {
- return;
- }
-
- message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
- message = "<span class='test-message'>" + message + "</span>";
-
- // pushFailure doesn't provide details.expected
- // when it calls, it's implicit to also not show expected and diff stuff
- // Also, we need to check details.expected existence, as it can exist and be undefined
- if ( !details.result && hasOwn.call( details, "expected" ) ) {
- expected = escapeText( QUnit.dump.parse( details.expected ) );
- actual = escapeText( QUnit.dump.parse( details.actual ) );
- message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
- expected +
- "</pre></td></tr>";
-
- if ( actual !== expected ) {
- message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
- actual + "</pre></td></tr>" +
- "<tr class='test-diff'><th>Diff: </th><td><pre>" +
- QUnit.diff( expected, actual ) + "</pre></td></tr>";
- }
-
- if ( details.source ) {
- message += "<tr class='test-source'><th>Source: </th><td><pre>" +
- escapeText( details.source ) + "</pre></td></tr>";
- }
-
- message += "</table>";
-
- // this occours when pushFailure is set and we have an extracted stack trace
- } else if ( !details.result && details.source ) {
- message += "<table>" +
- "<tr class='test-source'><th>Source: </th><td><pre>" +
- escapeText( details.source ) + "</pre></td></tr>" +
- "</table>";
- }
-
- assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
-
- assertLi = document.createElement( "li" );
- assertLi.className = details.result ? "pass" : "fail";
- assertLi.innerHTML = message;
- assertList.appendChild( assertLi );
-});
-
-QUnit.testDone(function( details ) {
- var testTitle, time, testItem, assertList,
- good, bad, testCounts,
- tests = id( "qunit-tests" );
-
- // QUnit.reset() is deprecated and will be replaced for a new
- // fixture reset function on QUnit 2.0/2.1.
- // It's still called here for backwards compatibility handling
- QUnit.reset();
-
- if ( !tests ) {
- return;
- }
-
- testItem = id( "qunit-test-output" + details.testNumber );
- assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
-
- good = details.passed;
- bad = details.failed;
-
- // store result when possible
- if ( config.reorder && defined.sessionStorage ) {
- if ( bad ) {
- sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
- } else {
- sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
- }
- }
-
- if ( bad === 0 ) {
- addClass( assertList, "qunit-collapsed" );
- }
-
- // testItem.firstChild is the test name
- testTitle = testItem.firstChild;
-
- testCounts = bad ?
- "<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " :
- "";
-
- testTitle.innerHTML += " <b class='counts'>(" + testCounts +
- details.assertions.length + ")</b>";
-
- addEvent( testTitle, "click", function() {
- toggleClass( assertList, "qunit-collapsed" );
- });
-
- time = document.createElement( "span" );
- time.className = "runtime";
- time.innerHTML = details.runtime + " ms";
-
- testItem.className = bad ? "fail" : "pass";
-
- testItem.insertBefore( time, assertList );
-});
-
-if ( !defined.document || document.readyState === "complete" ) {
- config.autorun = true;
-}
-
-if ( defined.document ) {
- addEvent( window, "load", QUnit.load );
-}
-
-})();
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/tests.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/tests.js b/contrib/views/files/src/main/resources/ui/app/assets/javascripts/tests.js
deleted file mode 100644
index b830f0f..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/tests.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var folderOrder = [
- 'test'
-];
-
-folderOrder.forEach(function(folder) {
- window.require.list().filter(function(module) {
- return new RegExp('^' + folder + '/').test(module);
- }).forEach(function(module) {
- require(module);
- });
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/stylesheets/qunit.css
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/stylesheets/qunit.css b/contrib/views/files/src/main/resources/ui/app/assets/stylesheets/qunit.css
deleted file mode 100644
index 9437b4b..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/stylesheets/qunit.css
+++ /dev/null
@@ -1,237 +0,0 @@
-/*!
- * QUnit 1.15.0
- * http://qunitjs.com/
- *
- * Copyright 2014 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2014-08-08T16:00Z
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
- font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
- margin: 0;
- padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
- padding: 0.5em 0 0.5em 1em;
-
- color: #8699A4;
- background-color: #0D3349;
-
- font-size: 1.5em;
- line-height: 1em;
- font-weight: 400;
-
- border-radius: 5px 5px 0 0;
-}
-
-#qunit-header a {
- text-decoration: none;
- color: #C2CCD1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
- color: #FFF;
-}
-
-#qunit-testrunner-toolbar label {
- display: inline-block;
- padding: 0 0.5em 0 0.1em;
-}
-
-#qunit-banner {
- height: 5px;
-}
-
-#qunit-testrunner-toolbar {
- padding: 0.5em 1em 0.5em 1em;
- color: #5E740B;
- background-color: #EEE;
- overflow: hidden;
-}
-
-#qunit-userAgent {
- padding: 0.5em 1em 0.5em 1em;
- background-color: #2B81AF;
- color: #FFF;
- text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
- float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
- list-style-position: inside;
-}
-
-#qunit-tests li {
- padding: 0.4em 1em 0.4em 1em;
- border-bottom: 1px solid #FFF;
- list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
- display: none;
-}
-
-#qunit-tests li strong {
- cursor: pointer;
-}
-
-#qunit-tests li a {
- padding: 0.5em;
- color: #C2CCD1;
- text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
- color: #000;
-}
-
-#qunit-tests li .runtime {
- float: right;
- font-size: smaller;
-}
-
-.qunit-assert-list {
- margin-top: 0.5em;
- padding: 0.5em;
-
- background-color: #FFF;
-
- border-radius: 5px;
-}
-
-.qunit-collapsed {
- display: none;
-}
-
-#qunit-tests table {
- border-collapse: collapse;
- margin-top: 0.2em;
-}
-
-#qunit-tests th {
- text-align: right;
- vertical-align: top;
- padding: 0 0.5em 0 0;
-}
-
-#qunit-tests td {
- vertical-align: top;
-}
-
-#qunit-tests pre {
- margin: 0;
- white-space: pre-wrap;
- word-wrap: break-word;
-}
-
-#qunit-tests del {
- background-color: #E0F2BE;
- color: #374E0C;
- text-decoration: none;
-}
-
-#qunit-tests ins {
- background-color: #FFCACA;
- color: #500;
- text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts { color: #000; }
-#qunit-tests b.passed { color: #5E740B; }
-#qunit-tests b.failed { color: #710909; }
-
-#qunit-tests li li {
- padding: 5px;
- background-color: #FFF;
- border-bottom: none;
- list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
- color: #3C510C;
- background-color: #FFF;
- border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected { color: #999; }
-
-#qunit-banner.qunit-pass { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
- color: #710909;
- background-color: #FFF;
- border-left: 10px solid #EE5757;
- white-space: pre;
-}
-
-#qunit-tests > li:last-child {
- border-radius: 0 0 5px 5px;
-}
-
-#qunit-tests .fail { color: #000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name { color: #000; }
-
-#qunit-tests .fail .test-actual { color: #EE5757; }
-#qunit-tests .fail .test-expected { color: #008000; }
-
-#qunit-banner.qunit-fail { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
- padding: 0.5em 1em 0.5em 1em;
-
- color: #2B81AF;
- background-color: #D2E0E6;
-
- border-bottom: 1px solid #FFF;
-}
-#qunit-testresult .module-name {
- font-weight: 700;
-}
-
-/** Fixture */
-
-#qunit-fixture {
- position: absolute;
- top: -10000px;
- left: -10000px;
- width: 1000px;
- height: 1000px;
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/tests.html
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/tests.html b/contrib/views/files/src/main/resources/ui/app/assets/tests.html
deleted file mode 100644
index fb9b730..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/tests.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements. See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership. The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
--->
-
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
- <title>Files tests</title>
- <link rel="stylesheet" href="stylesheets/qunit.css">
-</head>
-<body>
- <div id="qunit"></div>
- <div id="qunit-fixture"></div>
- <div id="ember-testing"></div>
- <script src="javascripts/qunit.js"></script>
- <script src="javascripts/vendor.js"></script>
- <script src="javascripts/jquery.mockjax.js"></script>
- <script src="javascripts/ember-qunit.js"></script>
- <script src="javascripts/app.js"></script>
- <script>
- emq.globalize();
- require('initialize');
- App.setupForTesting();
- App.injectTestHelpers();
- setResolver(Em.DefaultResolver.create({ namespace: App }));
- App.rootElement = '#ember-testing'
- </script>
- <script src="javascripts/test.js"></script>
- <script src="javascripts/tests.js"></script>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/.gitkeep b/contrib/views/files/src/main/resources/ui/app/components/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/alert-message-display.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/alert-message-display.js b/contrib/views/files/src/main/resources/ui/app/components/alert-message-display.js
new file mode 100644
index 0000000..840dbf3
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/alert-message-display.js
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import {shortenText} from '../helpers/shorten-text';
+
+export default Ember.Component.extend({
+ shorten: false,
+ length: 100,
+ expanded: false,
+ shortenedValue: Ember.computed('value', 'shorten', 'expanded', function() {
+ if (this.get('expanded')) {
+ return this.get('value');
+ }
+ if (this.get('shorten')) {
+ let length = this.get('length');
+ let shortenedText = shortenText([this.get('value'), length]);
+ this.set('shorten', shortenedText !== this.get('value'));
+ return shortenedText;
+ } else {
+ return this.get('value');
+ }
+ }),
+
+ actions: {
+ toggleExpanded() {
+ this.toggleProperty('expanded');
+ }
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/alert-message.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/alert-message.js b/contrib/views/files/src/main/resources/ui/app/components/alert-message.js
new file mode 100644
index 0000000..ef9179a
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/components/alert-message.js
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+ classNames: ['flash-messages'],
+
+ actions: {
+ closeAlert() {
+ const flash = this.get('flash');
+ flash.destroyMessage();
+ }
+ }
+
+
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/breadCrumbs.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/breadCrumbs.js b/contrib/views/files/src/main/resources/ui/app/components/breadCrumbs.js
deleted file mode 100644
index 72d5daf..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/breadCrumbs.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.BreadCrumbsComponent = Ember.CollectionView.extend({
- classNames: ['breadcrumb pull-left'],
- tagName: 'ul',
- path:'',
- content: function (argument) {
- var crumbs = [];
- var currentPath = this.get('path').match(/((?!\/)\S)+/g)||[];
- currentPath.forEach(function (cur,i,array) {
- return crumbs.push({name:cur,path:'/'+array.slice(0,i+1).join('/')});
- });
- crumbs.unshift({name:'/',path:'/'});
- crumbs.set('lastObject.last','true');
- return crumbs;
- }.property('path'),
- itemViewClass: Ember.View.extend({
- classNameBindings: ['isActive:active'],
- template: Ember.Handlebars.compile("{{#link-to 'files' (query-params path=view.content.path)}}{{view.content.name}}{{/link-to}}"),
- isActive: function () {
- return this.get('content.last');
- }.property('content'),
- click:function () {
- if (this.get('isActive')) {
- this.get('controller').send('refreshDir');
- }
- }
- })
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/bsPopover.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/bsPopover.js b/contrib/views/files/src/main/resources/ui/app/components/bsPopover.js
deleted file mode 100644
index dbc9785..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/bsPopover.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.BsPopoverComponent = Ember.BsPopoverComponent.extend({});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/bulkCheckbox.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/bulkCheckbox.js b/contrib/views/files/src/main/resources/ui/app/components/bulkCheckbox.js
deleted file mode 100644
index 9872c53..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/bulkCheckbox.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.BulkCheckboxComponent = Em.Checkbox.extend({
- selectedAll:Em.computed.alias('checked'),
- selectAll:function () {
- this.get('content').setEach('selected',this.get('selectedAll'));
- }.on('change'),
- selection:function () {
- this.set('selectedAll', !!(this.get('content.length') && this.get('content').isEvery('selected',true)));
- }.observes('content.@each.selected')
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/components/confirmDelete.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/components/confirmDelete.js b/contrib/views/files/src/main/resources/ui/app/components/confirmDelete.js
deleted file mode 100644
index 9431840..0000000
--- a/contrib/views/files/src/main/resources/ui/app/components/confirmDelete.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.DropdownWrapComponent = Em.Component.extend({
- onResetConfirm:function () {
- var childs = this.get('childViews').filter(function (view) {
- return view instanceof App.ConfirmDeleteComponent;
- });
- childs.setEach('isRemoving',false);
- }.on('resetConfirm'),
- didInsertElement:function(){
- this.$().on('hidden.bs.dropdown',Em.run.bind(this,this.onResetConfirm));
- }
-});
-
-App.ConfirmDeleteComponent = Em.Component.extend({
- layoutName:'components/deleteBulk',
- tagName:'li',
- classNameBindings:['access::disabled'],
- deleteForever:false,
- access:false,
- isRemoving:false,
- cancelRemoving:function () {
- this.set('isRemoving',false);
- },
- click:function (e) {
- if (!$(e.target).hasClass('delete')) {
- e.stopPropagation();
- }
- },
- actions:{
- ask:function () {
- if (this.get('access')) {
- this.get('parentView').trigger('resetConfirm');
- this.set('isRemoving',true);
- }
- return false;
- },
- cancel:function () {
- this.cancelRemoving();
- },
- confirm:function () {
- if (this.get('access')) {
- this.sendAction('confirm',this.get('deleteForever'));
- }
- }
- }
-});
[07/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/jquery.mockjax.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/jquery.mockjax.js b/contrib/views/files/src/main/resources/ui/app/assets/javascripts/jquery.mockjax.js
deleted file mode 100644
index 54fa8ec..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/jquery.mockjax.js
+++ /dev/null
@@ -1,692 +0,0 @@
-/*!
- * MockJax - jQuery Plugin to Mock Ajax requests
- *
- * Version: 1.6.0
- * Released:
- * Home: https://github.com/jakerella/jquery-mockjax
- * Author: Jonathan Sharp (http://jdsharp.com)
- * License: MIT,GPL
- *
- * Copyright (c) 2014 appendTo, Jordan Kasper
- * NOTE: This repository was taken over by Jordan Kasper (@jakerella) October, 2014
- *
- * Dual licensed under the MIT or GPL licenses.
- * http://opensource.org/licenses/MIT OR http://www.gnu.org/licenses/gpl-2.0.html
- */
-(function($) {
- var _ajax = $.ajax,
- mockHandlers = [],
- mockedAjaxCalls = [],
- unmockedAjaxCalls = [],
- CALLBACK_REGEX = /=\?(&|$)/,
- jsc = (new Date()).getTime();
-
-
- // Parse the given XML string.
- function parseXML(xml) {
- if ( window.DOMParser == undefined && window.ActiveXObject ) {
- DOMParser = function() { };
- DOMParser.prototype.parseFromString = function( xmlString ) {
- var doc = new ActiveXObject('Microsoft.XMLDOM');
- doc.async = 'false';
- doc.loadXML( xmlString );
- return doc;
- };
- }
-
- try {
- var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
- if ( $.isXMLDoc( xmlDoc ) ) {
- var err = $('parsererror', xmlDoc);
- if ( err.length == 1 ) {
- throw new Error('Error: ' + $(xmlDoc).text() );
- }
- } else {
- throw new Error('Unable to parse XML');
- }
- return xmlDoc;
- } catch( e ) {
- var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
- $(document).trigger('xmlParseError', [ msg ]);
- return undefined;
- }
- }
-
- // Check if the data field on the mock handler and the request match. This
- // can be used to restrict a mock handler to being used only when a certain
- // set of data is passed to it.
- function isMockDataEqual( mock, live ) {
- var identical = true;
- // Test for situations where the data is a querystring (not an object)
- if (typeof live === 'string') {
- // Querystring may be a regex
- return $.isFunction( mock.test ) ? mock.test(live) : mock == live;
- }
- $.each(mock, function(k) {
- if ( live[k] === undefined ) {
- identical = false;
- return identical;
- } else {
- if ( typeof live[k] === 'object' && live[k] !== null ) {
- if ( identical && $.isArray( live[k] ) ) {
- identical = $.isArray( mock[k] ) && live[k].length === mock[k].length;
- }
- identical = identical && isMockDataEqual(mock[k], live[k]);
- } else {
- if ( mock[k] && $.isFunction( mock[k].test ) ) {
- identical = identical && mock[k].test(live[k]);
- } else {
- identical = identical && ( mock[k] == live[k] );
- }
- }
- }
- });
-
- return identical;
- }
-
- // See if a mock handler property matches the default settings
- function isDefaultSetting(handler, property) {
- return handler[property] === $.mockjaxSettings[property];
- }
-
- // Check the given handler should mock the given request
- function getMockForRequest( handler, requestSettings ) {
- // If the mock was registered with a function, let the function decide if we
- // want to mock this request
- if ( $.isFunction(handler) ) {
- return handler( requestSettings );
- }
-
- // Inspect the URL of the request and check if the mock handler's url
- // matches the url for this ajax request
- if ( $.isFunction(handler.url.test) ) {
- // The user provided a regex for the url, test it
- if ( !handler.url.test( requestSettings.url ) ) {
- return null;
- }
- } else {
- // Look for a simple wildcard '*' or a direct URL match
- var star = handler.url.indexOf('*');
- if (handler.url !== requestSettings.url && star === -1 ||
- !new RegExp(handler.url.replace(/[-[\]{}()+?.,\\^$|#\s]/g, "\\$&").replace(/\*/g, '.+')).test(requestSettings.url)) {
- return null;
- }
- }
-
- // Inspect the data submitted in the request (either POST body or GET query string)
- if ( handler.data ) {
- if ( ! requestSettings.data || !isMockDataEqual(handler.data, requestSettings.data) ) {
- // They're not identical, do not mock this request
- return null;
- }
- }
- // Inspect the request type
- if ( handler && handler.type &&
- handler.type.toLowerCase() != requestSettings.type.toLowerCase() ) {
- // The request type doesn't match (GET vs. POST)
- return null;
- }
-
- return handler;
- }
-
- function parseResponseTimeOpt(responseTime) {
- if ($.isArray(responseTime)) {
- var min = responseTime[0];
- var max = responseTime[1];
- return (typeof min === 'number' && typeof max === 'number') ? Math.floor(Math.random() * (max - min)) + min : null;
- } else {
- return (typeof responseTime === 'number') ? responseTime: null;
- }
- }
-
- // Process the xhr objects send operation
- function _xhrSend(mockHandler, requestSettings, origSettings) {
-
- // This is a substitute for < 1.4 which lacks $.proxy
- var process = (function(that) {
- return function() {
- return (function() {
- // The request has returned
- this.status = mockHandler.status;
- this.statusText = mockHandler.statusText;
- this.readyState = 1;
-
- var finishRequest = function () {
- this.readyState = 4;
-
- var onReady;
- // Copy over our mock to our xhr object before passing control back to
- // jQuery's onreadystatechange callback
- if ( requestSettings.dataType == 'json' && ( typeof mockHandler.responseText == 'object' ) ) {
- this.responseText = JSON.stringify(mockHandler.responseText);
- } else if ( requestSettings.dataType == 'xml' ) {
- if ( typeof mockHandler.responseXML == 'string' ) {
- this.responseXML = parseXML(mockHandler.responseXML);
- //in jQuery 1.9.1+, responseXML is processed differently and relies on responseText
- this.responseText = mockHandler.responseXML;
- } else {
- this.responseXML = mockHandler.responseXML;
- }
- } else if (typeof mockHandler.responseText === 'object' && mockHandler.responseText !== null) {
- // since jQuery 1.9 responseText type has to match contentType
- mockHandler.contentType = 'application/json';
- this.responseText = JSON.stringify(mockHandler.responseText);
- } else {
- this.responseText = mockHandler.responseText;
- }
- if( typeof mockHandler.status == 'number' || typeof mockHandler.status == 'string' ) {
- this.status = mockHandler.status;
- }
- if( typeof mockHandler.statusText === "string") {
- this.statusText = mockHandler.statusText;
- }
- // jQuery 2.0 renamed onreadystatechange to onload
- onReady = this.onreadystatechange || this.onload;
-
- // jQuery < 1.4 doesn't have onreadystate change for xhr
- if ( $.isFunction( onReady ) ) {
- if( mockHandler.isTimeout) {
- this.status = -1;
- }
- onReady.call( this, mockHandler.isTimeout ? 'timeout' : undefined );
- } else if ( mockHandler.isTimeout ) {
- // Fix for 1.3.2 timeout to keep success from firing.
- this.status = -1;
- }
- };
-
- // We have an executable function, call it to give
- // the mock handler a chance to update it's data
- if ( $.isFunction(mockHandler.response) ) {
- // Wait for it to finish
- if ( mockHandler.response.length === 2 ) {
- mockHandler.response(origSettings, function () {
- finishRequest.call(that);
- });
- return;
- } else {
- mockHandler.response(origSettings);
- }
- }
-
- finishRequest.call(that);
- }).apply(that);
- };
- })(this);
-
- if ( mockHandler.proxy ) {
- // We're proxying this request and loading in an external file instead
- _ajax({
- global: false,
- url: mockHandler.proxy,
- type: mockHandler.proxyType,
- data: mockHandler.data,
- dataType: requestSettings.dataType === "script" ? "text/plain" : requestSettings.dataType,
- complete: function(xhr) {
- mockHandler.responseXML = xhr.responseXML;
- mockHandler.responseText = xhr.responseText;
- // Don't override the handler status/statusText if it's specified by the config
- if (isDefaultSetting(mockHandler, 'status')) {
- mockHandler.status = xhr.status;
- }
- if (isDefaultSetting(mockHandler, 'statusText')) {
- mockHandler.statusText = xhr.statusText;
- }
- this.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime) || 0);
- }
- });
- } else {
- // type == 'POST' || 'GET' || 'DELETE'
- if ( requestSettings.async === false ) {
- // TODO: Blocking delay
- process();
- } else {
- this.responseTimer = setTimeout(process, parseResponseTimeOpt(mockHandler.responseTime) || 50);
- }
- }
- }
-
- // Construct a mocked XHR Object
- function xhr(mockHandler, requestSettings, origSettings, origHandler) {
- // Extend with our default mockjax settings
- mockHandler = $.extend(true, {}, $.mockjaxSettings, mockHandler);
-
- if (typeof mockHandler.headers === 'undefined') {
- mockHandler.headers = {};
- }
- if (typeof requestSettings.headers === 'undefined') {
- requestSettings.headers = {};
- }
- if ( mockHandler.contentType ) {
- mockHandler.headers['content-type'] = mockHandler.contentType;
- }
-
- return {
- status: mockHandler.status,
- statusText: mockHandler.statusText,
- readyState: 1,
- open: function() { },
- send: function() {
- origHandler.fired = true;
- _xhrSend.call(this, mockHandler, requestSettings, origSettings);
- },
- abort: function() {
- clearTimeout(this.responseTimer);
- },
- setRequestHeader: function(header, value) {
- requestSettings.headers[header] = value;
- },
- getResponseHeader: function(header) {
- // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
- if ( mockHandler.headers && mockHandler.headers[header] ) {
- // Return arbitrary headers
- return mockHandler.headers[header];
- } else if ( header.toLowerCase() == 'last-modified' ) {
- return mockHandler.lastModified || (new Date()).toString();
- } else if ( header.toLowerCase() == 'etag' ) {
- return mockHandler.etag || '';
- } else if ( header.toLowerCase() == 'content-type' ) {
- return mockHandler.contentType || 'text/plain';
- }
- },
- getAllResponseHeaders: function() {
- var headers = '';
- // since jQuery 1.9 responseText type has to match contentType
- if (mockHandler.contentType) {
- mockHandler.headers['Content-Type'] = mockHandler.contentType;
- }
- $.each(mockHandler.headers, function(k, v) {
- headers += k + ': ' + v + "\n";
- });
- return headers;
- }
- };
- }
-
- // Process a JSONP mock request.
- function processJsonpMock( requestSettings, mockHandler, origSettings ) {
- // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
- // because there isn't an easy hook for the cross domain script tag of jsonp
-
- processJsonpUrl( requestSettings );
-
- requestSettings.dataType = "json";
- if(requestSettings.data && CALLBACK_REGEX.test(requestSettings.data) || CALLBACK_REGEX.test(requestSettings.url)) {
- createJsonpCallback(requestSettings, mockHandler, origSettings);
-
- // We need to make sure
- // that a JSONP style response is executed properly
-
- var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
- parts = rurl.exec( requestSettings.url ),
- remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
-
- requestSettings.dataType = "script";
- if(requestSettings.type.toUpperCase() === "GET" && remote ) {
- var newMockReturn = processJsonpRequest( requestSettings, mockHandler, origSettings );
-
- // Check if we are supposed to return a Deferred back to the mock call, or just
- // signal success
- if(newMockReturn) {
- return newMockReturn;
- } else {
- return true;
- }
- }
- }
- return null;
- }
-
- // Append the required callback parameter to the end of the request URL, for a JSONP request
- function processJsonpUrl( requestSettings ) {
- if ( requestSettings.type.toUpperCase() === "GET" ) {
- if ( !CALLBACK_REGEX.test( requestSettings.url ) ) {
- requestSettings.url += (/\?/.test( requestSettings.url ) ? "&" : "?") +
- (requestSettings.jsonp || "callback") + "=?";
- }
- } else if ( !requestSettings.data || !CALLBACK_REGEX.test(requestSettings.data) ) {
- requestSettings.data = (requestSettings.data ? requestSettings.data + "&" : "") + (requestSettings.jsonp || "callback") + "=?";
- }
- }
-
- // Process a JSONP request by evaluating the mocked response text
- function processJsonpRequest( requestSettings, mockHandler, origSettings ) {
- // Synthesize the mock request for adding a script tag
- var callbackContext = origSettings && origSettings.context || requestSettings,
- newMock = null;
-
-
- // If the response handler on the moock is a function, call it
- if ( mockHandler.response && $.isFunction(mockHandler.response) ) {
- mockHandler.response(origSettings);
- } else {
-
- // Evaluate the responseText javascript in a global context
- if( typeof mockHandler.responseText === 'object' ) {
- $.globalEval( '(' + JSON.stringify( mockHandler.responseText ) + ')');
- } else {
- $.globalEval( '(' + mockHandler.responseText + ')');
- }
- }
-
- // Successful response
- setTimeout(function() {
- jsonpSuccess( requestSettings, callbackContext, mockHandler );
- jsonpComplete( requestSettings, callbackContext, mockHandler );
- }, parseResponseTimeOpt(mockHandler.responseTime) || 0);
-
- // If we are running under jQuery 1.5+, return a deferred object
- if($.Deferred){
- newMock = new $.Deferred();
- if(typeof mockHandler.responseText == "object"){
- newMock.resolveWith( callbackContext, [mockHandler.responseText] );
- }
- else{
- newMock.resolveWith( callbackContext, [$.parseJSON( mockHandler.responseText )] );
- }
- }
- return newMock;
- }
-
-
- // Create the required JSONP callback function for the request
- function createJsonpCallback( requestSettings, mockHandler, origSettings ) {
- var callbackContext = origSettings && origSettings.context || requestSettings;
- var jsonp = requestSettings.jsonpCallback || ("jsonp" + jsc++);
-
- // Replace the =? sequence both in the query string and the data
- if ( requestSettings.data ) {
- requestSettings.data = (requestSettings.data + "").replace(CALLBACK_REGEX, "=" + jsonp + "$1");
- }
-
- requestSettings.url = requestSettings.url.replace(CALLBACK_REGEX, "=" + jsonp + "$1");
-
-
- // Handle JSONP-style loading
- window[ jsonp ] = window[ jsonp ] || function( tmp ) {
- data = tmp;
- jsonpSuccess( requestSettings, callbackContext, mockHandler );
- jsonpComplete( requestSettings, callbackContext, mockHandler );
- // Garbage collect
- window[ jsonp ] = undefined;
-
- try {
- delete window[ jsonp ];
- } catch(e) {}
-
- if ( head ) {
- head.removeChild( script );
- }
- };
- }
-
- // The JSONP request was successful
- function jsonpSuccess(requestSettings, callbackContext, mockHandler) {
- // If a local callback was specified, fire it and pass it the data
- if ( requestSettings.success ) {
- requestSettings.success.call( callbackContext, mockHandler.responseText || "", status, {} );
- }
-
- // Fire the global callback
- if ( requestSettings.global ) {
- (requestSettings.context ? $(requestSettings.context) : $.event).trigger("ajaxSuccess", [{}, requestSettings]);
- }
- }
-
- // The JSONP request was completed
- function jsonpComplete(requestSettings, callbackContext) {
- // Process result
- if ( requestSettings.complete ) {
- requestSettings.complete.call( callbackContext, {} , status );
- }
-
- // The request was completed
- if ( requestSettings.global ) {
- (requestSettings.context ? $(requestSettings.context) : $.event).trigger("ajaxComplete", [{}, requestSettings]);
- }
-
- // Handle the global AJAX counter
- if ( requestSettings.global && ! --$.active ) {
- $.event.trigger( "ajaxStop" );
- }
- }
-
-
- // The core $.ajax replacement.
- function handleAjax( url, origSettings ) {
- var mockRequest, requestSettings, mockHandler, overrideCallback;
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- origSettings = url;
- url = undefined;
- } else {
- // work around to support 1.5 signature
- origSettings = origSettings || {};
- origSettings.url = url;
- }
-
- // Extend the original settings for the request
- requestSettings = $.extend(true, {}, $.ajaxSettings, origSettings);
-
- // Generic function to override callback methods for use with
- // callback options (onAfterSuccess, onAfterError, onAfterComplete)
- overrideCallback = function(action, mockHandler) {
- var origHandler = origSettings[action.toLowerCase()];
- return function() {
- if ( $.isFunction(origHandler) ) {
- origHandler.apply(this, [].slice.call(arguments));
- }
- mockHandler['onAfter' + action]();
- };
- };
-
- // Iterate over our mock handlers (in registration order) until we find
- // one that is willing to intercept the request
- for(var k = 0; k < mockHandlers.length; k++) {
- if ( !mockHandlers[k] ) {
- continue;
- }
-
- mockHandler = getMockForRequest( mockHandlers[k], requestSettings );
- if(!mockHandler) {
- // No valid mock found for this request
- continue;
- }
-
- mockedAjaxCalls.push(requestSettings);
-
- // If logging is enabled, log the mock to the console
- $.mockjaxSettings.log( mockHandler, requestSettings );
-
-
- if ( requestSettings.dataType && requestSettings.dataType.toUpperCase() === 'JSONP' ) {
- if ((mockRequest = processJsonpMock( requestSettings, mockHandler, origSettings ))) {
- // This mock will handle the JSONP request
- return mockRequest;
- }
- }
-
-
- // Removed to fix #54 - keep the mocking data object intact
- //mockHandler.data = requestSettings.data;
-
- mockHandler.cache = requestSettings.cache;
- mockHandler.timeout = requestSettings.timeout;
- mockHandler.global = requestSettings.global;
-
- // In the case of a timeout, we just need to ensure
- // an actual jQuery timeout (That is, our reponse won't)
- // return faster than the timeout setting.
- if ( mockHandler.isTimeout ) {
- if ( mockHandler.responseTime > 1 ) {
- origSettings.timeout = mockHandler.responseTime - 1;
- } else {
- mockHandler.responseTime = 2;
- origSettings.timeout = 1;
- }
- mockHandler.isTimeout = false;
- }
-
- // Set up onAfter[X] callback functions
- if ( $.isFunction( mockHandler.onAfterSuccess ) ) {
- origSettings.success = overrideCallback('Success', mockHandler);
- }
- if ( $.isFunction( mockHandler.onAfterError ) ) {
- origSettings.error = overrideCallback('Error', mockHandler);
- }
- if ( $.isFunction( mockHandler.onAfterComplete ) ) {
- origSettings.complete = overrideCallback('Complete', mockHandler);
- }
-
- copyUrlParameters(mockHandler, origSettings);
-
- (function(mockHandler, requestSettings, origSettings, origHandler) {
-
- mockRequest = _ajax.call($, $.extend(true, {}, origSettings, {
- // Mock the XHR object
- xhr: function() { return xhr( mockHandler, requestSettings, origSettings, origHandler ); }
- }));
- })(mockHandler, requestSettings, origSettings, mockHandlers[k]);
-
- return mockRequest;
- }
-
- // We don't have a mock request
- unmockedAjaxCalls.push(origSettings);
- if($.mockjaxSettings.throwUnmocked === true) {
- throw new Error('AJAX not mocked: ' + origSettings.url);
- }
- else { // trigger a normal request
- return _ajax.apply($, [origSettings]);
- }
- }
-
- /**
- * Copies URL parameter values if they were captured by a regular expression
- * @param {Object} mockHandler
- * @param {Object} origSettings
- */
- function copyUrlParameters(mockHandler, origSettings) {
- //parameters aren't captured if the URL isn't a RegExp
- if (!(mockHandler.url instanceof RegExp)) {
- return;
- }
- //if no URL params were defined on the handler, don't attempt a capture
- if (!mockHandler.hasOwnProperty('urlParams')) {
- return;
- }
- var captures = mockHandler.url.exec(origSettings.url);
- //the whole RegExp match is always the first value in the capture results
- if (captures.length === 1) {
- return;
- }
- captures.shift();
- //use handler params as keys and capture resuts as values
- var i = 0,
- capturesLength = captures.length,
- paramsLength = mockHandler.urlParams.length,
- //in case the number of params specified is less than actual captures
- maxIterations = Math.min(capturesLength, paramsLength),
- paramValues = {};
- for (i; i < maxIterations; i++) {
- var key = mockHandler.urlParams[i];
- paramValues[key] = captures[i];
- }
- origSettings.urlParams = paramValues;
- }
-
-
- // Public
-
- $.extend({
- ajax: handleAjax
- });
-
- $.mockjaxSettings = {
- //url: null,
- //type: 'GET',
- log: function( mockHandler, requestSettings ) {
- if ( mockHandler.logging === false ||
- ( typeof mockHandler.logging === 'undefined' && $.mockjaxSettings.logging === false ) ) {
- return;
- }
- if ( window.console && console.log ) {
- var message = 'MOCK ' + requestSettings.type.toUpperCase() + ': ' + requestSettings.url;
- var request = $.extend({}, requestSettings);
-
- if (typeof console.log === 'function') {
- console.log(message, request);
- } else {
- try {
- console.log( message + ' ' + JSON.stringify(request) );
- } catch (e) {
- console.log(message);
- }
- }
- }
- },
- logging: true,
- status: 200,
- statusText: "OK",
- responseTime: 500,
- isTimeout: false,
- throwUnmocked: false,
- contentType: 'text/plain',
- response: '',
- responseText: '',
- responseXML: '',
- proxy: '',
- proxyType: 'GET',
-
- lastModified: null,
- etag: '',
- headers: {
- etag: 'IJF@H#@923uf8023hFO@I#H#',
- 'content-type' : 'text/plain'
- }
- };
-
- $.mockjax = function(settings) {
- var i = mockHandlers.length;
- mockHandlers[i] = settings;
- return i;
- };
- $.mockjax.clear = function(i) {
- if ( arguments.length == 1 ) {
- mockHandlers[i] = null;
- } else {
- mockHandlers = [];
- }
- mockedAjaxCalls = [];
- unmockedAjaxCalls = [];
- };
- // support older, deprecated version
- $.mockjaxClear = function(i) {
- window.console && window.console.warn && window.console.warn( 'DEPRECATED: The $.mockjaxClear() method has been deprecated in 1.6.0. Please use $.mockjax.clear() as the older function will be removed soon!' );
- $.mockjax.clear();
- };
- $.mockjax.handler = function(i) {
- if ( arguments.length == 1 ) {
- return mockHandlers[i];
- }
- };
- $.mockjax.mockedAjaxCalls = function() {
- return mockedAjaxCalls;
- };
- $.mockjax.unfiredHandlers = function() {
- var results = [];
- for (var i=0, len=mockHandlers.length; i<len; i++) {
- var handler = mockHandlers[i];
- if (handler !== null && !handler.fired) {
- results.push(handler);
- }
- }
- return results;
- };
- $.mockjax.unmockedAjaxCalls = function() {
- return unmockedAjaxCalls;
- };
-})(jQuery);
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/modernizr-2.6.2.min.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/modernizr-2.6.2.min.js b/contrib/views/files/src/main/resources/ui/app/assets/javascripts/modernizr-2.6.2.min.js
deleted file mode 100755
index f65d479..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/modernizr-2.6.2.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
- * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
- */
-;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:
absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'<style id="s',h,'">',a,
"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.
call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=funct
ion(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=fun
ction(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("
transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayTy
pe("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L
in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var
d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.create
Element("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){functio
n d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.load
er={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,
i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.
addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
[10/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
AMBARI-15145. Revamped Filebrowser Design - UI. (dipayanb)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/b988562a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/b988562a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/b988562a
Branch: refs/heads/trunk
Commit: b988562aa75531aef5f77ec5ee02d22bbb13fe07
Parents: db999ae
Author: Dipayan Bhowmick <di...@gmail.com>
Authored: Wed Feb 24 23:47:02 2016 +0530
Committer: Dipayan Bhowmick <di...@gmail.com>
Committed: Wed Feb 24 23:47:02 2016 +0530
----------------------------------------------------------------------
contrib/views/files/pom.xml | 72 +-
.../view/filebrowser/FileOperationService.java | 250 +-
.../ambari/view/filebrowser/HdfsService.java | 23 +-
.../ambari/view/filebrowser/HelpService.java | 2 +-
.../views/files/src/main/resources/ui/.bowerrc | 4 +
.../files/src/main/resources/ui/.editorconfig | 34 +
.../files/src/main/resources/ui/.ember-cli | 27 +
.../files/src/main/resources/ui/.gitignore | 35 +-
.../views/files/src/main/resources/ui/.jshintrc | 33 +
.../files/src/main/resources/ui/.travis.yml | 39 +
.../files/src/main/resources/ui/.watchmanconfig | 20 +
.../views/files/src/main/resources/ui/README.md | 68 +
.../files/src/main/resources/ui/app/adapter.js | 419 ---
.../resources/ui/app/adapters/application.js | 38 +
.../src/main/resources/ui/app/adapters/file.js | 66 +
.../files/src/main/resources/ui/app/app.js | 19 +-
.../ui/app/assets/fonts/fontawesome-webfont.eot | Bin 38205 -> 0 bytes
.../ui/app/assets/fonts/fontawesome-webfont.svg | 414 ---
.../ui/app/assets/fonts/fontawesome-webfont.ttf | Bin 80652 -> 0 bytes
.../app/assets/fonts/fontawesome-webfont.woff | Bin 44432 -> 0 bytes
.../fonts/glyphicons-halflings-regular.eot | Bin 20290 -> 0 bytes
.../fonts/glyphicons-halflings-regular.svg | 229 --
.../fonts/glyphicons-halflings-regular.ttf | Bin 41236 -> 0 bytes
.../fonts/glyphicons-halflings-regular.woff | Bin 23292 -> 0 bytes
.../src/main/resources/ui/app/assets/index.html | 34 -
.../ui/app/assets/javascripts/ember-qunit.js | 266 --
.../ui/app/assets/javascripts/jquery.mockjax.js | 692 -----
.../assets/javascripts/modernizr-2.6.2.min.js | 4 -
.../ui/app/assets/javascripts/qunit.js | 2495 ------------------
.../ui/app/assets/javascripts/tests.js | 29 -
.../ui/app/assets/stylesheets/qunit.css | 237 --
.../src/main/resources/ui/app/assets/tests.html | 46 -
.../main/resources/ui/app/components/.gitkeep | 0
.../ui/app/components/alert-message-display.js | 45 +
.../ui/app/components/alert-message.js | 32 +
.../resources/ui/app/components/breadCrumbs.js | 47 -
.../resources/ui/app/components/bsPopover.js | 21 -
.../resources/ui/app/components/bulkCheckbox.js | 29 -
.../ui/app/components/confirmDelete.js | 65 -
.../ui/app/components/context-row-menu.js | 137 +
.../resources/ui/app/components/contextMenu.js | 42 -
.../resources/ui/app/components/copy-modal.js | 126 +
.../resources/ui/app/components/delete-modal.js | 130 +
.../ui/app/components/directory-viewer.js | 165 ++
.../resources/ui/app/components/file-row.js | 37 +
.../resources/ui/app/components/file-search.js | 42 +
.../ui/app/components/files-breadcrumb.js | 69 +
.../ui/app/components/files-collection.js | 98 +
.../resources/ui/app/components/mkdirInput.js | 50 -
.../resources/ui/app/components/move-modal.js | 126 +
.../ui/app/components/new-directory.js | 75 +
.../ui/app/components/open-preview-modal.js | 56 +
.../ui/app/components/permission-modal.js | 116 +
.../ui/app/components/popoverDelete.js | 68 -
.../resources/ui/app/components/rename-modal.js | 77 +
.../resources/ui/app/components/renameInput.js | 92 -
.../resources/ui/app/components/sortArrow.js | 34 -
.../ui/app/components/toggleContext.js | 79 -
.../resources/ui/app/components/upload-file.js | 92 +
.../resources/ui/app/components/uploader.js | 111 -
.../resources/ui/app/config/files-columns.js | 73 +
.../main/resources/ui/app/controllers/.gitkeep | 0
.../resources/ui/app/controllers/application.js | 24 +
.../resources/ui/app/controllers/chmodModal.js | 49 -
.../main/resources/ui/app/controllers/error.js | 49 -
.../main/resources/ui/app/controllers/file.js | 117 -
.../main/resources/ui/app/controllers/files.js | 299 +--
.../resources/ui/app/controllers/filesAlert.js | 32 -
.../resources/ui/app/controllers/messages.js | 32 +
.../ui/app/controllers/messages/message.js | 31 +
.../ui/app/controllers/previewModal.js | 91 -
.../src/main/resources/ui/app/helpers/.gitkeep | 0
.../app/helpers/alert-message-context-class.js | 27 +
.../ui/app/helpers/alert-message-icon-class.js | 37 +
.../ui/app/helpers/get-sorting-icon.js | 34 +
.../ui/app/helpers/get-value-from-columns.js | 34 +
.../resources/ui/app/helpers/shorten-text.js | 32 +
.../main/resources/ui/app/helpers/show-date.js | 27 +
.../resources/ui/app/helpers/size-humanize.js | 33 +
.../ui/app/helpers/string-capitalize.js | 25 +
.../files/src/main/resources/ui/app/index.html | 42 +
.../src/main/resources/ui/app/initialize.js | 99 -
.../resources/ui/app/mixins/file-operation.js | 57 +
.../resources/ui/app/mixins/operation-modal.js | 82 +
.../src/main/resources/ui/app/models/.gitkeep | 0
.../src/main/resources/ui/app/models/alert.js | 27 +
.../src/main/resources/ui/app/models/file.js | 50 +-
.../files/src/main/resources/ui/app/router.js | 16 +-
.../src/main/resources/ui/app/routes/.gitkeep | 0
.../main/resources/ui/app/routes/application.js | 78 +
.../src/main/resources/ui/app/routes/error.js | 21 -
.../src/main/resources/ui/app/routes/file.js | 134 -
.../src/main/resources/ui/app/routes/files.js | 61 +
.../src/main/resources/ui/app/routes/index.js | 25 +
.../main/resources/ui/app/routes/messages.js | 31 +
.../resources/ui/app/routes/messages/message.js | 31 +
.../main/resources/ui/app/serializers/file.js | 23 +
.../resources/ui/app/services/alert-messages.js | 126 +
.../main/resources/ui/app/services/file-copy.js | 48 +
.../main/resources/ui/app/services/file-move.js | 47 +
.../resources/ui/app/services/file-operation.js | 199 ++
.../resources/ui/app/services/file-preview.js | 119 +
.../resources/ui/app/services/file-rename.js | 54 +
.../resources/ui/app/services/files-download.js | 157 ++
.../ui/app/services/files-selection.js | 64 +
.../ui/app/services/modal-event-bus.js | 48 +
.../src/main/resources/ui/app/styles/app.less | 188 ++
.../resources/ui/app/styles/application.less | 388 ---
.../resources/ui/app/templates/application.hbs | 48 +-
.../ui/app/templates/components/.gitkeep | 0
.../components/alert-message-display.hbs | 34 +
.../app/templates/components/alert-message.hbs | 34 +
.../ui/app/templates/components/chmodInput.hbs | 100 -
.../templates/components/context-row-menu.hbs | 39 +
.../ui/app/templates/components/contextMenu.hbs | 43 -
.../ui/app/templates/components/copy-modal.hbs | 87 +
.../app/templates/components/delete-modal.hbs | 69 +
.../ui/app/templates/components/deleteBulk.hbs | 46 -
.../app/templates/components/deletePopover.hbs | 38 -
.../templates/components/directory-viewer.hbs | 17 +
.../ui/app/templates/components/file-row.hbs | 46 +
.../ui/app/templates/components/file-search.hbs | 20 +
.../templates/components/files-breadcrumb.hbs | 42 +
.../templates/components/files-collection.hbs | 53 +
.../ui/app/templates/components/mkdirInput.hbs | 37 -
.../ui/app/templates/components/move-modal.hbs | 87 +
.../app/templates/components/new-directory.hbs | 48 +
.../templates/components/open-preview-modal.hbs | 38 +
.../templates/components/permission-modal.hbs | 69 +
.../app/templates/components/rename-modal.hbs | 50 +
.../ui/app/templates/components/renameInput.hbs | 38 -
.../ui/app/templates/components/upload-file.hbs | 56 +
.../ui/app/templates/components/uploader.hbs | 35 -
.../main/resources/ui/app/templates/error.hbs | 32 -
.../main/resources/ui/app/templates/files.hbs | 293 +-
.../main/resources/ui/app/templates/index.hbs | 18 -
.../main/resources/ui/app/templates/loading.hbs | 25 +
.../resources/ui/app/templates/messages.hbs | 54 +
.../ui/app/templates/messages/message.hbs | 48 +
.../resources/ui/app/templates/modal/chmod.hbs | 97 -
.../ui/app/templates/modal/preview.hbs | 33 -
.../ui/app/templates/util/errorRow.hbs | 32 -
.../resources/ui/app/templates/util/fileRow.hbs | 79 -
.../resources/ui/app/transforms/iso-date.js | 35 +
.../resources/ui/app/utils/file-uploader.js | 32 +
.../src/main/resources/ui/app/views/file.js | 33 -
.../src/main/resources/ui/app/views/files.js | 32 -
.../main/resources/ui/app/views/filesAlert.js | 23 -
.../main/resources/ui/app/views/modalChmod.js | 50 -
.../main/resources/ui/app/views/modalPreview.js | 51 -
.../files/src/main/resources/ui/bower.json | 43 +-
.../files/src/main/resources/ui/config.coffee | 53 -
.../src/main/resources/ui/config/environment.js | 69 +
.../src/main/resources/ui/ember-cli-build.js | 68 +
.../ui/generators/collection/collection.js.hbs | 23 -
.../ui/generators/collection/generator.json | 9 -
.../ui/generators/controller/controller.js.hbs | 23 -
.../ui/generators/controller/generator.json | 9 -
.../ui/generators/model/generator.json | 9 -
.../resources/ui/generators/model/model.js.hbs | 23 -
.../ui/generators/route/generator.json | 9 -
.../resources/ui/generators/route/route.js.hbs | 25 -
.../ui/generators/template/generator.json | 9 -
.../ui/generators/template/template.hbs.hbs | 18 -
.../resources/ui/generators/view/generator.json | 9 -
.../resources/ui/generators/view/view.js.hbs | 23 -
.../files/src/main/resources/ui/package.json | 78 +-
.../views/files/src/main/resources/ui/runner.js | 136 -
.../ui/test/unit/controllers/files_test.js | 32 -
.../files/src/main/resources/ui/testem.json | 12 +
.../files/src/main/resources/ui/tests/.jshintrc | 52 +
.../resources/ui/tests/helpers/destroy-app.js | 23 +
.../resources/ui/tests/helpers/flash-message.js | 24 +
.../ui/tests/helpers/module-for-acceptance.js | 41 +
.../main/resources/ui/tests/helpers/resolver.js | 29 +
.../resources/ui/tests/helpers/start-app.js | 36 +
.../src/main/resources/ui/tests/index.html | 52 +
.../resources/ui/tests/integration/.gitkeep | 0
.../src/main/resources/ui/tests/test-helper.js | 26 +
.../src/main/resources/ui/tests/unit/.gitkeep | 0
.../files/src/main/resources/ui/vendor/.gitkeep | 0
.../main/resources/ui/vendor/js/bsPopover.js | 190 --
.../resources/ui/vendor/js/ember-cloaking.js | 436 ---
183 files changed, 5719 insertions(+), 8928 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/pom.xml
----------------------------------------------------------------------
diff --git a/contrib/views/files/pom.xml b/contrib/views/files/pom.xml
index 09d3abd..ccdd281 100644
--- a/contrib/views/files/pom.xml
+++ b/contrib/views/files/pom.xml
@@ -132,47 +132,44 @@
<directory>${ui.directory}</directory>
<followSymlinks>false</followSymlinks>
<includes>
- <include>public/**</include>
+ <include>tmp/**</include>
+ <!--
<include>node_modules/**</include>
<include>bower_components/**</include>
+ -->
<include>node/**</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
+
+ <!-- Building frontend -->
<plugin>
<groupId>com.github.eirslett</groupId>
<artifactId>frontend-maven-plugin</artifactId>
<version>0.0.16</version>
<configuration>
- <workingDirectory>${ui.directory}</workingDirectory>
+ <nodeVersion>v0.12.2</nodeVersion>
+ <npmVersion>1.4.8</npmVersion>
+ <workingDirectory>src/main/resources/ui/</workingDirectory>
</configuration>
-
<executions>
<execution>
<id>install node and npm</id>
+ <phase>generate-sources</phase>
<goals>
<goal>install-node-and-npm</goal>
</goals>
- <!-- optional: default phase is "generate-resources" -->
- <phase>initialize</phase>
- <configuration>
- <nodeVersion>v0.10.26</nodeVersion>
- <npmVersion>1.4.3</npmVersion>
- </configuration>
</execution>
<execution>
<id>npm install</id>
+ <phase>generate-sources</phase>
<goals>
<goal>npm</goal>
</goals>
- <phase>generate-resources</phase>
<configuration>
- <!-- optional: The default argument is actually "install", so unless
- you need to run some other npm command, you can remove this whole <configuration>
- section. -->
- <arguments>install --unsafe-perm</arguments>
+ <arguments>install --python="${project.basedir}/../src/main/unix/ambari-python-wrap" --unsafe-perm</arguments>
</configuration>
</execution>
</executions>
@@ -180,52 +177,21 @@
<plugin>
<artifactId>exec-maven-plugin</artifactId>
<groupId>org.codehaus.mojo</groupId>
- <version>1.2.1</version>
+ <version>1.3.2</version>
<executions>
<execution>
- <id>node gyp executable</id>
- <phase>initialize</phase>
- <goals>
- <goal>exec</goal>
- </goals>
- <configuration>
- <skip>${skip.nodegyp.chmod}</skip>
- <workingDirectory>${ui.directory}</workingDirectory>
- <executable>chmod</executable>
- <arguments>
- <argument>+x</argument>
- <argument>${ui.directory}/node/npm/bin/node-gyp-bin/node-gyp</argument>
- </arguments>
- </configuration>
- </execution>
- <execution>
- <id>Bower install</id>
- <phase>generate-resources</phase>
- <goals>
- <goal>exec</goal>
- </goals>
- <configuration>
- <workingDirectory>${ui.directory}</workingDirectory>
- <executable>${ui.directory}/node/${node.executable}</executable>
- <arguments>
- <argument>${ui.directory}/node_modules/bower/bin/bower</argument>
- <argument>install</argument>
- <argument>--allow-root</argument>
- </arguments>
- </configuration>
- </execution>
- <execution>
- <id>Brunch build</id>
- <phase>generate-resources</phase>
+ <id>Files build</id>
+ <phase>generate-sources</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
- <workingDirectory>${ui.directory}</workingDirectory>
- <executable>${ui.directory}/node/${node.executable}</executable>
+ <workingDirectory>${basedir}/src/main/resources/ui</workingDirectory>
+ <executable>node/node</executable>
<arguments>
- <argument>node_modules/brunch/bin/brunch</argument>
+ <argument>node_modules/.bin/ember</argument>
<argument>build</argument>
+ <argument>--environment=production</argument>
</arguments>
</configuration>
</execution>
@@ -266,7 +232,7 @@
</plugins>
<resources>
<resource>
- <directory>src/main/resources/ui/public</directory>
+ <directory>src/main/resources/ui/dist</directory>
<filtering>false</filtering>
</resource>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/FileOperationService.java
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/FileOperationService.java b/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/FileOperationService.java
index 973fb8f..a0793ac 100644
--- a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/FileOperationService.java
+++ b/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/FileOperationService.java
@@ -19,6 +19,10 @@
package org.apache.ambari.view.filebrowser;
import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
@@ -90,7 +94,7 @@ public class FileOperationService extends HdfsService {
result = Response.ok(getApi(context).fileStatusToJSON(api
.getFileStatus(request.dst)));
} else {
- result = Response.ok(new BoolResult(false, "Can't move '" + request.src + "' to '" + request.dst + "'")).status(422);
+ result = Response.ok(new FileOperationResult(false, "Can't move '" + request.src + "' to '" + request.dst + "'")).status(422);
}
return result.build();
} catch (WebApplicationException ex) {
@@ -117,7 +121,7 @@ public class FileOperationService extends HdfsService {
result = Response.ok(getApi(context).fileStatusToJSON(api
.getFileStatus(request.path)));
} else {
- result = Response.ok(new BoolResult(false, "Can't chmod '" + request.path + "'")).status(422);
+ result = Response.ok(new FileOperationResult(false, "Can't chmod '" + request.path + "'")).status(422);
}
return result.build();
} catch (WebApplicationException ex) {
@@ -133,26 +137,99 @@ public class FileOperationService extends HdfsService {
* @return response with success
*/
@POST
+ @Path("/move")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response move(final MultiSrcDstFileRequest request,
+ @Context HttpHeaders headers, @Context UriInfo ui) {
+ try {
+ HdfsApi api = getApi(context);
+ ResponseBuilder result;
+ String message = "";
+
+ List<String> sources = request.sourcePaths;
+ String destination = request.destinationPath;
+ if(sources.isEmpty()) {
+ result = Response.ok(new FileOperationResult(false, "Can't move 0 file/folder to '" + destination + "'")).
+ status(422);
+ return result.build();
+ }
+
+ int index = 0;
+ for (String src : sources) {
+ String fileName = getFileName(src);
+ String finalDestination = getDestination(destination, fileName);
+ try {
+ if (api.rename(src, finalDestination)) {
+ index ++;
+ } else {
+ message = "Failed to move '" + src + "' to '" + finalDestination + "'";
+ break;
+ }
+ } catch (IOException exception) {
+ message = exception.getMessage();
+ logger.error("Failed to move '{}' to '{}'. Exception: {}", src, finalDestination,
+ exception.getMessage());
+ break;
+ }
+ }
+ if (index == sources.size()) {
+ result = Response.ok(new FileOperationResult(true)).status(200);
+ } else {
+ FileOperationResult errorResult = getFailureFileOperationResult(sources, index, message);
+ result = Response.ok(errorResult).status(422);
+ }
+ return result.build();
+ } catch (Exception ex) {
+ throw new ServiceFormattedException(ex.getMessage(), ex);
+ }
+ }
+
+ /**
+ * Copy file
+ * @param request source and destination request
+ * @return response with success
+ */
+ @POST
@Path("/copy")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
- public Response copy(final SrcDstFileRequest request,
+ public Response copy(final MultiSrcDstFileRequest request,
@Context HttpHeaders headers, @Context UriInfo ui) {
try {
HdfsApi api = getApi(context);
ResponseBuilder result;
- try {
- api.copy(request.src, request.dst);
+ String message = "";
- result = Response.ok(getApi(context).fileStatusToJSON(api
- .getFileStatus(request.dst)));
- } catch (HdfsApiException e) {
- result = Response.ok(new BoolResult(false, "Can't copy '" + request.src + "' to '" + request.dst + "'")).
- status(422);
+ List<String> sources = request.sourcePaths;
+ String destination = request.destinationPath;
+ if(sources.isEmpty()) {
+ result = Response.ok(new FileOperationResult(false, "Can't copy 0 file/folder to '" + destination + "'")).
+ status(422);
+ return result.build();
+ }
+
+ int index = 0;
+ for (String src : sources) {
+ String fileName = getFileName(src);
+ String finalDestination = getDestination(destination, fileName);
+ try {
+ api.copy(src, finalDestination);
+ index ++;
+ } catch (IOException|HdfsApiException exception) {
+ message = exception.getMessage();
+ logger.error("Failed to copy '{}' to '{}'. Exception: {}", src, finalDestination,
+ exception.getMessage());
+ break;
+ }
+ }
+ if (index == sources.size()) {
+ result = Response.ok(new FileOperationResult(true)).status(200);
+ } else {
+ FileOperationResult errorResult = getFailureFileOperationResult(sources, index, message);
+ result = Response.ok(errorResult).status(422);
}
return result.build();
- } catch (WebApplicationException ex) {
- throw ex;
} catch (Exception ex) {
throw new ServiceFormattedException(ex.getMessage(), ex);
}
@@ -173,7 +250,7 @@ public class FileOperationService extends HdfsService {
if (api.mkdir(request.path)) {
result = Response.ok(getApi(context).fileStatusToJSON(api.getFileStatus(request.path)));
} else {
- result = Response.ok(new BoolResult(false, "Can't create dir '" + request.path + "'")).status(422);
+ result = Response.ok(new FileOperationResult(false, "Can't create dir '" + request.path + "'")).status(422);
}
return result.build();
} catch (WebApplicationException ex) {
@@ -194,7 +271,7 @@ public class FileOperationService extends HdfsService {
try {
HdfsApi api = getApi(context);
api.emptyTrash();
- return Response.ok(new BoolResult(true)).build();
+ return Response.ok(new FileOperationResult(true)).build();
} catch (WebApplicationException ex) {
throw ex;
} catch (Exception ex) {
@@ -211,31 +288,49 @@ public class FileOperationService extends HdfsService {
@Path("/moveToTrash")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
- public Response moveToTrash(RemoveRequest request) {
+ public Response moveToTrash(MultiRemoveRequest request) {
try {
ResponseBuilder result;
-
HdfsApi api = getApi(context);
String trash = api.getTrashDirPath();
+ String message = "";
- if (!api.exists(trash)) {
- if (!api.mkdir(trash)) {
- result = Response.ok(new BoolResult(false, "Trash dir does not exists. Can't create dir for trash '" + trash + "'")).status(422);
- return result.build();
+ if (request.paths.size() == 0) {
+ result = Response.ok(new FileOperationResult(false, "No path entries provided.")).status(422);
+ } else {
+ if (!api.exists(trash)) {
+ if (!api.mkdir(trash)) {
+ result = Response.ok(new FileOperationResult(false, "Trash dir does not exists. Can't create dir for " +
+ "trash '" + trash + "'")).status(422);
+ return result.build();
+ }
}
- }
- String trashFilePath = api.getTrashDirPath(request.path);
-
- if (api.rename(request.path, trashFilePath)) {
- result = Response.ok(getApi(context).fileStatusToJSON(api
- .getFileStatus(trashFilePath)));
- } else {
- result = Response.ok(new BoolResult(false, "Can't move file to '" + trashFilePath + "'")).status(422);
+ int index = 0;
+ for (MultiRemoveRequest.PathEntry entry : request.paths) {
+ String trashFilePath = api.getTrashDirPath(entry.path);
+ try {
+ if (api.rename(entry.path, trashFilePath)) {
+ index ++;
+ } else {
+ message = "Failed to move '" + entry.path + "' to '" + trashFilePath + "'";
+ break;
+ }
+ } catch (IOException exception) {
+ message = exception.getMessage();
+ logger.error("Failed to move '{}' to '{}'. Exception: {}", entry.path, trashFilePath,
+ exception.getMessage());
+ break;
+ }
+ }
+ if (index == request.paths.size()) {
+ result = Response.ok(new FileOperationResult(true)).status(200);
+ } else {
+ FileOperationResult errorResult = getFailureFileOperationResult(getPathsFromPathsEntries(request.paths), index, message);
+ result = Response.ok(errorResult).status(422);
+ }
}
return result.build();
- } catch (WebApplicationException ex) {
- throw ex;
} catch (Exception ex) {
throw new ServiceFormattedException(ex.getMessage(), ex);
}
@@ -250,24 +345,84 @@ public class FileOperationService extends HdfsService {
@Path("/remove")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
- public Response remove(RemoveRequest request, @Context HttpHeaders headers,
+ public Response remove(MultiRemoveRequest request, @Context HttpHeaders headers,
@Context UriInfo ui) {
try {
HdfsApi api = getApi(context);
ResponseBuilder result;
- if (api.delete(request.path, request.recursive)) {
- result = Response.ok(new BoolResult(true)).status(204);
+ String message = "";
+ if(request.paths.size() == 0) {
+ result = Response.ok(new FileOperationResult(false, "No path entries provided."));
} else {
- result = Response.ok(new BoolResult(false, "Can't remove '" + request.path + "'")).status(422);
+ int index = 0;
+ for (MultiRemoveRequest.PathEntry entry : request.paths) {
+ try {
+ if (api.delete(entry.path, entry.recursive)) {
+ index++;
+ } else {
+ message = "Failed to remove '" + entry.path + "'";
+ break;
+ }
+ } catch (IOException exception) {
+ message = exception.getMessage();
+ logger.error("Failed to remove '{}'. Exception: {}", entry.path, exception.getMessage());
+ break;
+ }
+
+ }
+ if (index == request.paths.size()) {
+ result = Response.ok(new FileOperationResult(true)).status(200);
+ } else {
+ FileOperationResult errorResult = getFailureFileOperationResult(getPathsFromPathsEntries(request.paths), index, message);
+ result = Response.ok(errorResult).status(422);
+ }
}
return result.build();
- } catch (WebApplicationException ex) {
- throw ex;
} catch (Exception ex) {
throw new ServiceFormattedException(ex.getMessage(), ex);
}
}
+ private List<String> getPathsFromPathsEntries(List<MultiRemoveRequest.PathEntry> paths) {
+ List<String> entries = new ArrayList<>();
+ for(MultiRemoveRequest.PathEntry path: paths) {
+ entries.add(path.path);
+ }
+ return entries;
+ }
+
+ private FileOperationResult getFailureFileOperationResult(List<String> paths, int failedIndex, String message) {
+ List<String> succeeded = new ArrayList<>();
+ List<String> unprocessed = new ArrayList<>();
+ List<String> failed = new ArrayList<>();
+ ListIterator<String> iter = paths.listIterator();
+ while (iter.hasNext()) {
+ int index = iter.nextIndex();
+ String path = iter.next();
+ if (index < failedIndex) {
+ succeeded.add(path);
+ } else if (index == failedIndex) {
+ failed.add(path);
+ } else {
+ unprocessed.add(path);
+ }
+ }
+ return new FileOperationResult(false, message, succeeded, failed, unprocessed);
+ }
+
+ private String getDestination(String baseDestination, String fileName) {
+ if(baseDestination.endsWith("/")) {
+ return baseDestination + fileName;
+ } else {
+ return baseDestination + "/" + fileName;
+ }
+ }
+
+ private String getFileName(String srcPath) {
+ return srcPath.substring(srcPath.lastIndexOf('/') + 1);
+ }
+
+
/**
* Wrapper for json mapping of mkdir request
*/
@@ -301,12 +456,29 @@ public class FileOperationService extends HdfsService {
}
/**
+ * Wrapper for json mapping of request with multiple
+ * source and destination
+ */
+ @XmlRootElement
+ public static class MultiSrcDstFileRequest {
+ @XmlElement(nillable = false, required = true)
+ public List<String> sourcePaths = new ArrayList<>();
+ @XmlElement(nillable = false, required = true)
+ public String destinationPath;
+ }
+
+ /**
* Wrapper for json mapping of remove request
*/
@XmlRootElement
- public static class RemoveRequest {
+ public static class MultiRemoveRequest {
@XmlElement(nillable = false, required = true)
- public String path;
- public boolean recursive;
+ public List<PathEntry> paths = new ArrayList<>();
+ public static class PathEntry {
+ @XmlElement(nillable = false, required = true)
+ public String path;
+ public boolean recursive;
+ }
+
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HdfsService.java
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HdfsService.java b/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HdfsService.java
index d47304f..acaebfa 100644
--- a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HdfsService.java
+++ b/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HdfsService.java
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -50,20 +51,32 @@ public abstract class HdfsService {
}
/**
- * Wrapper for json mapping of bool response
+ * Wrapper for json mapping of result of Multi Remove Request
*/
@XmlRootElement
- public static class BoolResult{
+ public static class FileOperationResult {
public boolean success;
public String message;
- public BoolResult(boolean success){
+ public List<String> succeeded;
+ public List<String> failed;
+ public List<String> unprocessed;
+
+ public FileOperationResult(boolean success) {
this.success = success;
}
- public BoolResult(boolean success, String message){
- this.success = success;
+ public FileOperationResult(boolean success, String message) {
+ this(success);
this.message = message;
}
+
+ public FileOperationResult(boolean success, String message, List<String> succeeded, List<String> failed, List<String> unprocessed) {
+ this(success, message);
+ this.succeeded = succeeded;
+ this.failed = failed;
+ this.unprocessed = unprocessed;
+ }
+
}
private HdfsApi _api = null;
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HelpService.java
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HelpService.java b/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HelpService.java
index adc99a4..4fe1d20 100644
--- a/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HelpService.java
+++ b/contrib/views/files/src/main/java/org/apache/ambari/view/filebrowser/HelpService.java
@@ -109,7 +109,7 @@ public class HelpService extends HdfsService {
public Response trashEnabled() {
try {
HdfsApi api = getApi(context);
- return Response.ok(new BoolResult(api.trashEnabled())).build();
+ return Response.ok(new FileOperationResult(api.trashEnabled())).build();
} catch (WebApplicationException ex) {
throw ex;
} catch (Exception ex) {
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/.bowerrc
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/.bowerrc b/contrib/views/files/src/main/resources/ui/.bowerrc
new file mode 100644
index 0000000..959e169
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/.bowerrc
@@ -0,0 +1,4 @@
+{
+ "directory": "bower_components",
+ "analytics": false
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/.editorconfig
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/.editorconfig b/contrib/views/files/src/main/resources/ui/.editorconfig
new file mode 100644
index 0000000..47c5438
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/.editorconfig
@@ -0,0 +1,34 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+
+[*]
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = space
+indent_size = 2
+
+[*.js]
+indent_style = space
+indent_size = 2
+
+[*.hbs]
+insert_final_newline = false
+indent_style = space
+indent_size = 2
+
+[*.css]
+indent_style = space
+indent_size = 2
+
+[*.html]
+indent_style = space
+indent_size = 2
+
+[*.{diff,md}]
+trim_trailing_whitespace = false
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/.ember-cli
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/.ember-cli b/contrib/views/files/src/main/resources/ui/.ember-cli
new file mode 100644
index 0000000..5a339b9
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/.ember-cli
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+{
+ /**
+ Ember CLI sends analytics information by default. The data is completely
+ anonymous, but there are times when you might want to disable this behavior.
+
+ Setting `disableAnalytics` to true will prevent any data from being sent.
+ */
+ "disableAnalytics": false
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/.gitignore
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/.gitignore b/contrib/views/files/src/main/resources/ui/.gitignore
index 23e84db..8621d39 100644
--- a/contrib/views/files/src/main/resources/ui/.gitignore
+++ b/contrib/views/files/src/main/resources/ui/.gitignore
@@ -1,3 +1,24 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+
+# dependencies
+/node_modules
+/bower_components
+node/
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage/*
+/libpeerconnection.log
+npm-debug.log
+testem.log
+
+/.idea
+
# Numerous always-ignore extensions
*.diff
*.err
@@ -16,19 +37,7 @@
.project
.settings
.tmproj
+dist
nbproject
Thumbs.db
-# NPM packages folder.
-node_modules/
-
-bower_components/
-
-node/
-
-# Brunch folder for temporary files.
-tmp/
-
-public/
-
-_generators/
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/.jshintrc
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/.jshintrc b/contrib/views/files/src/main/resources/ui/.jshintrc
new file mode 100644
index 0000000..e75f719
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/.jshintrc
@@ -0,0 +1,33 @@
+{
+ "predef": [
+ "document",
+ "window",
+ "-Promise",
+ "moment"
+ ],
+ "browser": true,
+ "boss": true,
+ "curly": true,
+ "debug": false,
+ "devel": true,
+ "eqeqeq": true,
+ "evil": true,
+ "forin": false,
+ "immed": false,
+ "laxbreak": false,
+ "newcap": true,
+ "noarg": true,
+ "noempty": false,
+ "nonew": false,
+ "nomen": false,
+ "onevar": false,
+ "plusplus": false,
+ "regexp": false,
+ "undef": true,
+ "sub": true,
+ "strict": false,
+ "white": false,
+ "eqnull": true,
+ "esnext": true,
+ "unused": true
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/.travis.yml
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/.travis.yml b/contrib/views/files/src/main/resources/ui/.travis.yml
new file mode 100644
index 0000000..4e09a70
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/.travis.yml
@@ -0,0 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+language: node_js
+node_js:
+ - "0.12"
+
+sudo: false
+
+cache:
+ directories:
+ - node_modules
+
+before_install:
+ - export PATH=/usr/local/phantomjs-2.0.0/bin:$PATH
+ - "npm config set spin false"
+ - "npm install -g npm@^2"
+
+install:
+ - npm install -g bower
+ - npm install
+ - bower install
+
+script:
+ - npm test
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/.watchmanconfig
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/.watchmanconfig b/contrib/views/files/src/main/resources/ui/.watchmanconfig
new file mode 100644
index 0000000..523fdd7
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/.watchmanconfig
@@ -0,0 +1,20 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+{
+ "ignore_dirs": ["tmp", "dist"]
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/README.md
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/README.md b/contrib/views/files/src/main/resources/ui/README.md
new file mode 100644
index 0000000..1a8ad2e
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/README.md
@@ -0,0 +1,68 @@
+<!---
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements. See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License. You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+# Files-view
+
+This README outlines the details of collaborating on this Ember application.
+A short introduction of this app could easily go here.
+
+## Prerequisites
+
+You will need the following things properly installed on your computer.
+
+* [Git](http://git-scm.com/)
+* [Node.js](http://nodejs.org/) (with NPM)
+* [Bower](http://bower.io/)
+* [Ember CLI](http://www.ember-cli.com/)
+* [PhantomJS](http://phantomjs.org/)
+
+## Installation
+
+* `git clone <repository-url>` this repository
+* change into the new directory
+* `npm install`
+* `bower install`
+
+## Running / Development
+
+* `ember server`
+* Visit your app at [http://localhost:4200](http://localhost:4200).
+
+### Code Generators
+
+Make use of the many generators for code, try `ember help generate` for more details
+
+### Running Tests
+
+* `ember test`
+* `ember test --server`
+
+### Building
+
+* `ember build` (development)
+* `ember build --environment production` (production)
+
+### Deploying
+
+Specify what it takes to deploy your app.
+
+## Further Reading / Useful Links
+
+* [ember.js](http://emberjs.com/)
+* [ember-cli](http://www.ember-cli.com/)
+* Development Browser Extensions
+ * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi)
+ * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/)
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/adapter.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/adapter.js b/contrib/views/files/src/main/resources/ui/app/adapter.js
deleted file mode 100644
index d1d1d2c..0000000
--- a/contrib/views/files/src/main/resources/ui/app/adapter.js
+++ /dev/null
@@ -1,419 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-App = require('app');
-
-function promiseArray(promise, label) {
- return Ember.ArrayProxy.extend(Ember.PromiseProxyMixin).create({
- promise: Ember.RSVP.Promise.cast(promise, label)
- });
-}
-
-
-function serializerForAdapter(adapter, type) {
- var serializer = adapter.serializer,
- defaultSerializer = adapter.defaultSerializer,
- container = adapter.container;
-
- if (container && serializer === undefined) {
- serializer = serializerFor(container, type.typeKey, defaultSerializer);
- }
-
- if (serializer === null || serializer === undefined) {
- serializer = {
- extract: function(store, type, payload) { return payload; }
- };
- }
-
- return serializer;
-}
-
-function serializerFor(container, type, defaultSerializer) {
- return container.lookup('serializer:'+type) ||
- container.lookup('serializer:application') ||
- container.lookup('serializer:' + defaultSerializer) ||
- container.lookup('serializer:-default');
-}
-
-function _listdir(adapter, store, type, query, recordArray) {
- var promise = adapter.listdir(store, type, query, recordArray),
- serializer = serializerForAdapter(adapter, type),
- label = "";
-
- return Ember.RSVP.Promise.cast(promise, label).then(function(adapterPayload) {
- var payload = serializer.extract(store, type, adapterPayload, null, 'findAll');
-
- Ember.assert("The response from a findQuery must be an Array, not " + Ember.inspect(payload), Ember.typeOf(payload) === 'array');
-
- recordArray.load(payload);
- return recordArray;
- }, null, "DS: Extract payload of findQuery " + type);
-}
-
-function _move(adapter, store, record, query) {
- var type = store.modelFor('file'),
- promise = adapter.move(store, type, record, query),
- serializer = serializerForAdapter(adapter, type),
- label = "";
-
- return promise.then(function(adapterPayload) {
- var payload;
-
- if (adapterPayload) {
- payload = serializer.extractSingle(store, type, adapterPayload);
- } else {
- payload = adapterPayload;
- }
-
- //TODO very shady activity :/
- if (typeof record == 'object') {
- store.unloadRecord(record);
- }
-
- return store.push('file', payload);
- }, function(reason) {
-
- throw reason;
- }, label);
-}
-
-function _mkdir(adapter, store, type, query) {
- var promise = adapter.mkdir(store, type, query),
- serializer = serializerForAdapter(adapter, type),
- label = "";
-
- return promise.then(function(adapterPayload) {
- var payload;
-
- if (adapterPayload) {
- payload = serializer.extractSingle(store, type, adapterPayload);
- } else {
- payload = adapterPayload;
- }
-
- return store.push('file', payload);
- }, function(reason) {
- throw reason;
- }, label);
-}
-
-function _remove(adapter, store, record, query, toTrash) {
- var type = record.constructor;
- var method = (toTrash)?'moveToTrash':'remove';
- var promise = adapter[method](store, type, query),
- serializer = serializerForAdapter(adapter, type),
- label = "";
-
- return promise.then(function(adapterPayload) {
- store.unloadRecord(record);
- return record;
- }, function(reason) {
- if (reason instanceof DS.InvalidError) {
- store.recordWasInvalid(record, reason.errors);
- } else {
- record.rollback();
- //store.recordWasError(record, reason);
- }
-
- throw reason;
- }, label);
-}
-
-Ember.Inflector.inflector.uncountable('fileops');
-Ember.Inflector.inflector.uncountable('download');
-Ember.Inflector.inflector.uncountable('upload');
-
-function getNamespaceUrl() {
- var parts = window.location.pathname.match(/\/[^\/]*/g);
- var view = parts[1];
- var version = '/versions' + parts[2];
- var instance = parts[3];
- if (parts.length == 4) { // version is not present
- instance = parts[2];
- version = '';
- }
- return 'api/v1/views' + view + version + '/instances' + instance + '/';
-}
-
-App.ApplicationStore = DS.Store.extend({
- adapter: DS.RESTAdapter.extend({
- namespace: getNamespaceUrl() + 'resources/files',
- headers: {
- 'X-Requested-By': 'ambari'
- },
-
- /**
- @method ajaxOptions
- @param {String} url
- @param {String} type The request type GET, POST, PUT, DELETE etc.
- @param {Object} hash
- @return {Object} hash
- */
- ajaxOptions: function(url, type, options) {
- var hash = options || {};
- hash.url = url;
- hash.type = type;
- hash.dataType = 'json';
- hash.context = this;
-
- if (hash.data && type !== 'GET') {
- hash.contentType = 'application/json; charset=utf-8';
- hash.data = JSON.stringify(hash.data);
- }
-
- var headers = this.get('headers');
-
- if ((navigator.userAgent.indexOf("MSIE") != -1) || (!!navigator.userAgent.match(/Trident.*rv[ :]*11\./))) {
- headers['Cache-Control'] = 'no-cache, no-store, must-revalidate';
- headers['Pragma'] = 'no-cache';
- headers['Expires'] = '0';
- }
-
- if (headers !== undefined) {
- hash.beforeSend = function (xhr) {
- Ember.keys(headers).forEach(function (key) {
- xhr.setRequestHeader(key, headers[key]);
- });
- };
- }
-
- return hash;
- },
- listdir: function(store, type, query) {
- return this.ajax(this.buildURL('fileops','listdir'), 'GET', { data: query });
- },
- move:function (store, type, record, query) {
- return this.ajax(this.buildURL('fileops','rename'), 'POST', { data: query });
- },
- updateRecord:function (store, type, record) {
- var query = {
- "path":record.get('path'),
- "mode":record.get('permission')
- };
- return this.ajax(this.buildURL('fileops','chmod'), 'POST', { data: query });
- },
- mkdir:function (store, type, query) {
- return this.ajax(this.buildURL('fileops','mkdir'), 'PUT', { data: query });
- },
- remove:function (store, type, query) {
- return this.ajax(this.buildURL('fileops','remove'), 'DELETE', { data: query });
- },
- moveToTrash:function (store, type, query) {
- return this.ajax(this.buildURL('fileops','moveToTrash'), 'DELETE', { data: query });
- },
- downloadUrl:function (option, query) {
- return [this.buildURL('download',option),Em.$.param(query)].join('?');
- },
- linkFor:function (option, query) {
- return this.ajax(this.buildURL('download',[option,'generate-link'].join('/')), 'POST', { data: query });
- }
- }),
- listdir:function (path) {
- var query = {path: path};
- var type = this.modelFor('file');
- var array = this.recordArrayManager
- .createAdapterPopulatedRecordArray(type, query);
- this.recordArrayManager.registerFilteredRecordArray(array, type);
-
- var adapter = this.adapterFor(type);
-
- Ember.assert("You tried to load a query but you have no adapter (for " + type + ")", adapter);
- Ember.assert("You tried to load a query but your adapter does not implement `listdir`", adapter.listdir);
-
- return promiseArray(_listdir(adapter, this, type, query, array));
- },
- move:function (record, path) {
- var oldpath = (typeof record === 'string')?record:record.get('id');
- var query = {
- "src":oldpath,
- "dst":path
- };
- var promiseLabel = "DS: Model#move " + this;
- var resolver = Ember.RSVP.defer(promiseLabel);
- var adapter = this.adapterFor(record.constructor);
-
- resolver.resolve(_move(adapter, this, record, query));
-
- return DS.PromiseObject.create({ promise: resolver.promise });
- },
- chmod:function (record, path) {
- return record.save();
- },
- mkdir:function (path) {
- var query = {
- "path":path
- };
- var type = this.modelFor('file');
- var promiseLabel = "DS: Model#mkdir " + this;
- var resolver = Ember.RSVP.defer(promiseLabel);
- var adapter = this.adapterFor(type);
-
- resolver.resolve(_mkdir(adapter, this, type, query));
-
- return DS.PromiseObject.create({ promise: resolver.promise });
- },
- remove:function (record, toTrash) {
- var query = {
- "path":record.get('path'),
- "recursive":true
- };
- var type = this.modelFor('file');
- var promiseLabel = "DS: Model#remove " + this;
- var resolver = Ember.RSVP.defer(promiseLabel);
- var adapter = this.adapterFor(type);
-
- record.deleteRecord();
- resolver.resolve(_remove(adapter, this, record, query, toTrash));
-
- return DS.PromiseObject.create({ promise: resolver.promise });
- },
- /**
- * get dowload link
- * @param {Array} files records for download
- * @param {String} option browse, zip or concat
- * @param {Boolean} downloadArg
- * @return {Promise}
- */
- linkFor:function (files, option, downloadArg, checkperm) {
- var resolver = Ember.RSVP.defer('promiseLabel');
- var query, adapter = this.adapterFor(this.modelFor('file')),
- download = downloadArg || true,
- checkPermission = checkperm || false;
- option = option || "browse";
-
- if (option == 'browse') {
- query = { "path": (files.get('firstObject.path') || files.get('id')), "download": download, "checkperm": checkPermission };
- resolver.resolve(adapter.downloadUrl('browse',query));
- return resolver.promise;
- }
-
- query = {
- "entries": [],
- "download": download
- };
-
- files.forEach(function (item) {
- query.entries.push(item.get('path'));
- });
-
- resolver.resolve(adapter.linkFor(option, query));
-
- return resolver.promise.then(function(response) {
- return adapter.downloadUrl(option,response);
- }, function(reason) {
- throw reason;
- });
- }
-});
-
-App.FileSerializer = DS.RESTSerializer.extend({
- primaryKey:'path',
- extractSingle: function(store, type, payload, id, requestType) {
- payload = {'files': payload};
- return this._super(store, type, payload, id, requestType);
- },
- extractChmod:function(store, type, payload, id, requestType) {
- return this.extractSingle(store, type, payload, id, requestType);
- }
-});
-
-App.Uploader = Ember.Uploader.create({
- url: '',
- type:'PUT',
- upload: function(file,extraData) {
- var data = this.setupFormData(file,extraData);
- var url = this.get('url');
- var type = this.get('type');
- var self = this;
-
- this.set('isUploading', true);
-
- return this.ajax(url, data, type)
- .then(Em.run.bind(this,this.uploadSuccess),Em.run.bind(this,this.uploadFailed));
- },
- uploadSuccess:function(respData) {
- this.didUpload(respData);
- return respData;
- },
- uploadFailed:function (error) {
- this.set('isUploading', false);
- this.sendAlert(error);
- return error;
- },
- sendAlert: Em.K,
- ajax: function(url, params, method) {
- var self = this;
- var settings = {
- url: url,
- type: method || 'POST',
- contentType: false,
- processData: false,
- xhr: function() {
- var xhr = Ember.$.ajaxSettings.xhr();
- xhr.upload.onprogress = function(e) {
- self.didProgress(e);
- };
- return xhr;
- },
- beforeSend:function (xhr) {
- xhr.setRequestHeader('X-Requested-By', 'ambari');
- },
- data: params
- };
-
- return this._ajax(settings);
- }
-});
-
-App.IsodateTransform = DS.Transform.extend({
- deserialize: function (serialized) {
- if (serialized) {
- return moment.utc(serialized).toDate();
- }
- return serialized;
- },
- serialize: function (deserialized) {
- if (deserialized) {
- return moment(deserialized).format('X');
- }
- return deserialized;
- }
-});
-
-Ember.Handlebars.registerBoundHelper('showDate', function(date,format) {
- return moment(date).format(format);
-});
-
-Ember.Handlebars.registerBoundHelper('showDateUnix', function(date,format) {
- return moment.unix(date).format(format);
-});
-
-Ember.Handlebars.registerBoundHelper('capitalize', function(string) {
- return string.capitalize();
-});
-
-Ember.Handlebars.registerBoundHelper('humanSize', function(fileSizeInBytes) {
- var i = -1;
- var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
- do {
- fileSizeInBytes = fileSizeInBytes / 1024;
- i++;
- } while (fileSizeInBytes > 1024);
-
- return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/adapters/application.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/adapters/application.js b/contrib/views/files/src/main/resources/ui/app/adapters/application.js
new file mode 100644
index 0000000..a7ccbf4
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/adapters/application.js
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+import Ember from 'ember';
+
+export default DS.RESTAdapter.extend({
+ namespace: Ember.computed(function() {
+ var parts = window.location.pathname.match(/\/[^\/]*/g);
+ var view = parts[1];
+ var version = '/versions' + parts[2];
+ var instance = parts[3];
+ if (parts.length === 4) { // version is not present
+ instance = parts[2];
+ version = '';
+ }
+ return 'api/v1/views' + view + version + '/instances' + instance + '/resources/files/fileops';
+ }),
+
+ headers: {
+ 'X-Requested-By': 'ambari'
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/adapters/file.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/adapters/file.js b/contrib/views/files/src/main/resources/ui/app/adapters/file.js
new file mode 100644
index 0000000..331d554
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/adapters/file.js
@@ -0,0 +1,66 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import ApplicationAdapter from './application';
+
+export default ApplicationAdapter.extend({
+ pathForType: function(type) {
+ if (type === 'file') {
+ return 'listdir';
+ }
+ },
+ parseErrorResponse: function(responseText) {
+ var json = this._super(responseText);
+ if((typeof json) === 'object') {
+ var error = {};
+ if (Ember.isPresent(json.success)) {
+ // This error is for Invalid Error response (422)
+ error.success = json.success;
+ error.message = json.message;
+
+ delete json.success;
+ delete json.message;
+
+ if(Ember.isArray(json.succeeded)) {
+ error.succeeded = json.succeeded;
+ delete json.succeeded;
+ }
+ if (Ember.isArray(json.failed)) {
+ error.failed = json.failed;
+ delete json.failed;
+ }
+ if (Ember.isArray(json.unprocessed)) {
+ error.unprocessed = json.unprocessed;
+ delete json.unprocessed;
+ }
+ } else {
+ // Other errors
+ error.message = json.message;
+ error.trace = json.trace;
+ error.status = json.status;
+ delete json.trace;
+ delete json.status;
+ delete json.message;
+ }
+ json.errors = [error];
+ }
+
+ return json;
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/app.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/app.js b/contrib/views/files/src/main/resources/ui/app/app.js
index 7041224..7d9e22d 100644
--- a/contrib/views/files/src/main/resources/ui/app/app.js
+++ b/contrib/views/files/src/main/resources/ui/app/app.js
@@ -16,4 +16,21 @@
* limitations under the License.
*/
-module.exports = Em.Application.create();
+import Ember from 'ember';
+import Resolver from 'ember-resolver';
+import loadInitializers from 'ember/load-initializers';
+import config from './config/environment';
+
+let App;
+
+Ember.MODEL_FACTORY_INJECTIONS = true;
+
+App = Ember.Application.extend({
+ modulePrefix: config.modulePrefix,
+ podModulePrefix: config.podModulePrefix,
+ Resolver: Resolver
+});
+
+loadInitializers(App, config.modulePrefix);
+
+export default App;
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.eot
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.eot b/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.eot
deleted file mode 100644
index 7c79c6a..0000000
Binary files a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.eot and /dev/null differ
[08/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.ttf
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.ttf b/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index e89738d..0000000
Binary files a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.ttf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.woff
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.woff b/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.woff
deleted file mode 100644
index 8c1748a..0000000
Binary files a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.woff and /dev/null differ
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.eot
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.eot b/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.eot
deleted file mode 100644
index 423bd5d..0000000
Binary files a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.eot and /dev/null differ
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.svg
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.svg b/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.svg
deleted file mode 100644
index 4469488..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,229 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
-<font-face units-per-em="1200" ascent="960" descent="-240" />
-<missing-glyph horiz-adv-x="500" />
-<glyph />
-<glyph />
-<glyph unicode="
" />
-<glyph unicode=" " />
-<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
-<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
-<glyph unicode=" " />
-<glyph unicode=" " horiz-adv-x="652" />
-<glyph unicode=" " horiz-adv-x="1304" />
-<glyph unicode=" " horiz-adv-x="652" />
-<glyph unicode=" " horiz-adv-x="1304" />
-<glyph unicode=" " horiz-adv-x="434" />
-<glyph unicode=" " horiz-adv-x="326" />
-<glyph unicode=" " horiz-adv-x="217" />
-<glyph unicode=" " horiz-adv-x="217" />
-<glyph unicode=" " horiz-adv-x="163" />
-<glyph unicode=" " horiz-adv-x="260" />
-<glyph unicode=" " horiz-adv-x="72" />
-<glyph unicode=" " horiz-adv-x="260" />
-<glyph unicode=" " horiz-adv-x="326" />
-<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
-<glyph unicode="−" d="M200 400h900v300h-900v-300z" />
-<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
-<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
-<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
-<glyph unicode="" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
-<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
-<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
-<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
-<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
-<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
-<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
-<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
-<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0
21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
-<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
-<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
-<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
-<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
-<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
-<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
-<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
-<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
-<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
-<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
-<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
-<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
-<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
-<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
-<glyph unicode="" d="M0 25v475l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
-<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
-<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
-<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
-<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
-<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
-<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
-<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
-<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
-<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
-<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
-<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
-<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
-<glyph unicode="" d="M1 700v475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
-<glyph unicode="" d="M2 700v475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
-<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
-<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
-<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
-<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
-<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
-<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v70h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
-<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
-<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
-<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
-<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
-<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-10
0q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
-<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
-<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
-<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
-<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
-<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
-<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
-<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
-<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
-<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l566 567l-136 137l-430 -431l-147 147z" />
-<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
-<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
-<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" />
-<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
-<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
-<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
-<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
-<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
-<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
-<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
-<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
-<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h600v200h-600v-200z" />
-<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141z" />
-<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
-<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM363 700h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26 q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-105 0 -172 -56t-67 -183zM500 300h200v100h-200v-100z" />
-<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
-<glyph unicode="" d="M0 500v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200 v-206q149 48 201 206h-201v200h200q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210z" />
-<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
-<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
-<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
-<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" />
-<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
-<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
-<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" />
-<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
-<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
-<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
-<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
-<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100z M100 0h400v400h-400v-400zM200 900q-3 0 14 48t35 96l18 47l214 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
-<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
-<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
-<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
-<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
-<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
-<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64 q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
-<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
-<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
-<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
-<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
-<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
-<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
-<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
-<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
-<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
-<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
-<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
-<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
-<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
-<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM99 500v250v5q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351z M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
-<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37 t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
-<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
-<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 212l100 213h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
-<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
-<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
-<glyph unicode="" d="M-101 651q0 72 54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM999 201v600h200v-600h-200z" />
-<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
-<glyph unicode="" d="M1 585q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM76 565l237 339h503l89 -100v-294l-340 -130 q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
-<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 500h300l-2 -194l402 294l-402 298v-197h-298v-201z" />
-<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l400 -294v194h302v201h-300v197z" />
-<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
-<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
-<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -34 5.5 -93t7.5 -87q0 -9 17 -44t16 -60q12 0 23 -5.5 t23 -15t20 -13.5q20 -10 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55.5t-20 -57.5q12 -21 22.5 -34.5t28 -27t36.5 -17.5q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q101 -2 221 111q31 30 47 48t34 49t21 62q-14 9 -37.5 9.5t-35.5 7.5q-14 7 -49 15t-52 19 q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q8 16 22 22q6 -1 26 -1.5t33.5 -4.5t19.5 -13q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5 t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 3
6 -17 53.5t-64 28.5t-56 23 q-19 -3 -37 0q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -46 0t-45 -3q-20 -6 -51.5 -25.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79zM518 915q3 12 16 30.5t16 25.5q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -18 8 -42.5t16.5 -44 t9.5 -23.5q-6 1 -39 5t-53.5 10t-36.5 16z" />
-<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
-<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
-<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
-<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
-<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
-<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM513 609q0 32 21 56.5t52 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-16 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5q-37 0 -62.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
-<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36 q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60l517 511 q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
-<glyph unicode="" d="M79 784q0 131 99 229.5t230 98.5q144 0 242 -129q103 129 245 129q130 0 227 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100l-84.5 84.5t-68 74t-60 78t-33.5 70.5t-15 78z M250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-106 48.5q-73 0 -131 -83l-118 -171l-114 174q-51 80 -124 80q-59 0 -108.5 -49.5t-49.5 -118.5z" />
-<glyph unicode="" d="M57 353q0 -94 66 -160l141 -141q66 -66 159 -66q95 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141l19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
-<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
-<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
-<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5v-307l64 -14 q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5zM700 237 q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
-<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5 t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10 t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221z" />
-<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
-<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
-<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
-<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
-<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
-<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
-<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
-<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
-<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
-<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
-<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
-<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
-<glyph unicode="" d="M216 519q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40z" />
-<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
-<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
-<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
-<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
-<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
-<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
-<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 401h700v699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
-<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l248 -237v700h-699zM900 150h100v50h-100v-50z" />
-<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
-<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
-<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
-<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
-<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
-<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
-<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
-<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
-<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359z" />
-<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
-<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
-<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118q17 17 20 41.5 t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
-<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
-<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
-<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
-<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
-<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
-<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
-<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
-<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
-<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
-<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
-<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
-<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300 h200l-300 -300z" />
-<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
-<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
-<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
-</font>
-</defs></svg>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.ttf
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.ttf b/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.ttf
deleted file mode 100644
index a498ef4..0000000
Binary files a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.ttf and /dev/null differ
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.woff
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.woff b/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.woff
deleted file mode 100644
index d83c539..0000000
Binary files a/contrib/views/files/src/main/resources/ui/app/assets/fonts/glyphicons-halflings-regular.woff and /dev/null differ
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/index.html
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/index.html b/contrib/views/files/src/main/resources/ui/app/assets/index.html
deleted file mode 100644
index cc51a82..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/index.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="utf-8">
- <title>Filebrowser</title>
- <link rel="stylesheet" href="stylesheets/app.css">
- <script>
- EmberENV = {FEATURES: {'query-params-new': true}};
- </script>
- <script src="javascripts/vendor.js"></script>
- <script src="javascripts/app.js"></script>
- <script>require('initialize');</script>
-</head>
-<body>
- <!-- ApplicationView -->
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/ember-qunit.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/ember-qunit.js b/contrib/views/files/src/main/resources/ui/app/assets/javascripts/ember-qunit.js
deleted file mode 100644
index d1f1373..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/javascripts/ember-qunit.js
+++ /dev/null
@@ -1,266 +0,0 @@
-!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.emq=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
-"use strict";
-var testResolver = _dereq_("./test-resolver")["default"] || _dereq_("./test-resolver");
-var Ember = window.Ember["default"] || window.Ember;
-
-exports["default"] = function isolatedContainer(fullNames) {
- var resolver = testResolver.get();
- var container = new Ember.Container();
- container.optionsForType('component', { singleton: false });
- container.optionsForType('view', { singleton: false });
- container.optionsForType('template', { instantiate: false });
- container.optionsForType('helper', { instantiate: false });
- container.register('component-lookup:main', Ember.ComponentLookup);
- for (var i = fullNames.length; i > 0; i--) {
- var fullName = fullNames[i - 1];
- container.register(fullName, resolver.resolve(fullName));
- }
- return container;
-}
-},{"./test-resolver":7}],2:[function(_dereq_,module,exports){
-"use strict";
-var Ember = window.Ember["default"] || window.Ember;
-var isolatedContainer = _dereq_("./isolated-container")["default"] || _dereq_("./isolated-container");
-var moduleFor = _dereq_("./module-for")["default"] || _dereq_("./module-for");
-var moduleForComponent = _dereq_("./module-for-component")["default"] || _dereq_("./module-for-component");
-var moduleForModel = _dereq_("./module-for-model")["default"] || _dereq_("./module-for-model");
-var test = _dereq_("./test")["default"] || _dereq_("./test");
-var testResolver = _dereq_("./test-resolver")["default"] || _dereq_("./test-resolver");
-
-Ember.testing = true;
-
-function setResolver(resolver) {
- testResolver.set(resolver);
-}
-
-function globalize() {
- window.moduleFor = moduleFor;
- window.moduleForComponent = moduleForComponent;
- window.moduleForModel = moduleForModel;
- window.test = test;
- window.setResolver = setResolver;
-}
-
-exports.globalize = globalize;
-exports.moduleFor = moduleFor;
-exports.moduleForComponent = moduleForComponent;
-exports.moduleForModel = moduleForModel;
-exports.test = test;
-exports.setResolver = setResolver;
-},{"./isolated-container":1,"./module-for":5,"./module-for-component":3,"./module-for-model":4,"./test":8,"./test-resolver":7}],3:[function(_dereq_,module,exports){
-"use strict";
-var testResolver = _dereq_("./test-resolver")["default"] || _dereq_("./test-resolver");
-var moduleFor = _dereq_("./module-for")["default"] || _dereq_("./module-for");
-var Ember = window.Ember["default"] || window.Ember;
-
-exports["default"] = function moduleForComponent(name, description, callbacks) {
- var resolver = testResolver.get();
-
- moduleFor('component:' + name, description, callbacks, function(container, context, defaultSubject) {
- var layoutName = 'template:components/' + name;
-
- var layout = resolver.resolve(layoutName);
-
- if (layout) {
- container.register(layoutName, layout);
- container.injection('component:' + name, 'layout', layoutName);
- }
-
- context.dispatcher = Ember.EventDispatcher.create();
- context.dispatcher.setup({}, '#ember-testing');
-
- context.__setup_properties__.append = function(selector) {
- var containerView = Ember.ContainerView.create({container: container});
- var view = Ember.run(function(){
- var subject = context.subject();
- containerView.pushObject(subject);
- // TODO: destory this somewhere
- containerView.appendTo('#ember-testing');
- return subject;
- });
-
- return view.$();
- };
- context.__setup_properties__.$ = context.__setup_properties__.append;
- });
-}
-},{"./module-for":5,"./test-resolver":7}],4:[function(_dereq_,module,exports){
-"use strict";
-var moduleFor = _dereq_("./module-for")["default"] || _dereq_("./module-for");
-var Ember = window.Ember["default"] || window.Ember;
-
-exports["default"] = function moduleForModel(name, description, callbacks) {
- moduleFor('model:' + name, description, callbacks, function(container, context, defaultSubject) {
- if (DS._setupContainer) {
- DS._setupContainer(container);
- } else {
- container.register('store:main', DS.Store);
- }
-
- var adapterFactory = container.lookupFactory('adapter:application');
- if (!adapterFactory) {
- container.register('adapter:application', DS.FixtureAdapter);
- }
-
- context.__setup_properties__.store = function(){
- return container.lookup('store:main');
- };
-
- if (context.__setup_properties__.subject === defaultSubject) {
- context.__setup_properties__.subject = function(options) {
- return Ember.run(function() {
- return container.lookup('store:main').createRecord(name, options);
- });
- };
- }
- });
-}
-},{"./module-for":5}],5:[function(_dereq_,module,exports){
-"use strict";
-var Ember = window.Ember["default"] || window.Ember;
-//import QUnit from 'qunit'; // Assumed global in runner
-var testContext = _dereq_("./test-context")["default"] || _dereq_("./test-context");
-var isolatedContainer = _dereq_("./isolated-container")["default"] || _dereq_("./isolated-container");
-
-exports["default"] = function moduleFor(fullName, description, callbacks, delegate) {
- var container;
- var context;
-
- var _callbacks = {
- setup: function(){
- callbacks = callbacks || { };
-
- var needs = [fullName].concat(callbacks.needs || []);
- container = isolatedContainer(needs);
-
- callbacks.subject = callbacks.subject || defaultSubject;
-
- callbacks.setup = callbacks.setup || function() { };
- callbacks.teardown = callbacks.teardown || function() { };
-
- function factory() {
- return container.lookupFactory(fullName);
- }
-
- testContext.set({
- container: container,
- factory: factory,
- dispatcher: null,
- __setup_properties__: callbacks
- });
-
- context = testContext.get();
-
- if (delegate) {
- delegate(container, context, defaultSubject);
- }
-
- if (Ember.$('#ember-testing').length === 0) {
- Ember.$('<div id="ember-testing"/>').appendTo(document.body);
- }
-
- buildContextVariables(context);
- callbacks.setup.call(context, container);
- },
-
- teardown: function(){
- Ember.run(function(){
- container.destroy();
-
- if (context.dispatcher) {
- context.dispatcher.destroy();
- }
- });
-
- callbacks.teardown(container);
- Ember.$('#ember-testing').empty();
- }
- };
-
- QUnit.module(description || fullName, _callbacks);
-}
-
-function defaultSubject(options, factory) {
- return factory.create(options);
-}
-
-// allow arbitrary named factories, like rspec let
-function buildContextVariables(context) {
- var cache = { };
- var callbacks = context.__setup_properties__;
- var container = context.container;
- var factory = context.factory;
-
- Ember.keys(callbacks).filter(function(key){
- // ignore the default setup/teardown keys
- return key !== 'setup' && key !== 'teardown';
- }).forEach(function(key){
- context[key] = function(options) {
- if (cache[key]) { return cache[key]; }
-
- var result = callbacks[key](options, factory(), container);
- cache[key] = result;
- return result;
- };
- });
-}
-},{"./isolated-container":1,"./test-context":6}],6:[function(_dereq_,module,exports){
-"use strict";
-var __test_context__;
-
-function set(context) {
- __test_context__ = context;
-}
-
-exports.set = set;function get() {
- return __test_context__;
-}
-
-exports.get = get;
-},{}],7:[function(_dereq_,module,exports){
-"use strict";
-var __resolver__;
-
-function set(resolver) {
- __resolver__ = resolver;
-}
-
-exports.set = set;function get() {
- if (__resolver__ == null) throw new Error('you must set a resolver with `testResolver.set(resolver)`');
- return __resolver__;
-}
-
-exports.get = get;
-},{}],8:[function(_dereq_,module,exports){
-"use strict";
-var Ember = window.Ember["default"] || window.Ember;
-//import QUnit from 'qunit'; // Assumed global in runner
-var testContext = _dereq_("./test-context")["default"] || _dereq_("./test-context");
-
-function resetViews() {
- Ember.View.views = {};
-}
-
-exports["default"] = function test(testName, callback) {
-
- function wrapper() {
- var context = testContext.get();
-
- resetViews();
- var result = callback.call(context);
-
- function failTestOnPromiseRejection(reason) {
- ok(false, reason);
- }
-
- Ember.run(function(){
- stop();
- Ember.RSVP.Promise.cast(result)['catch'](failTestOnPromiseRejection)['finally'](start);
- });
- }
-
- QUnit.test(testName, wrapper);
-}
-},{"./test-context":6}]},{},[2])
-(2)
-});
[03/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/file-preview.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/file-preview.js b/contrib/views/files/src/main/resources/ui/app/services/file-preview.js
new file mode 100644
index 0000000..2dc8558
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/file-preview.js
@@ -0,0 +1,119 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FileOperationMixin from '../mixins/file-operation';
+
+export default Ember.Service.extend(FileOperationMixin, {
+ fileSelectionService: Ember.inject.service('files-selection'),
+ selectedFiles: Ember.computed.alias('fileSelectionService.files'),
+ selected: Ember.computed('selectedFiles', function () {
+ return this.get('selectedFiles').objectAt(0);
+ }),
+ selectedFilePath: Ember.computed('selected.path', function () {
+ return this.get('selected.path');
+ }),
+ filesDownloadService: Ember.inject.service('files-download'),
+ fileContent: '',
+ startIndex: 0,
+ offset: 5000,
+ path: '',
+ isLoading: false,
+ fileFetchFinished: false,
+ hasError: false,
+
+ endIndex: function () {
+ return this.get('startIndex') + this.get('offset');
+ }.property('startIndex'),
+
+ reset: function () {
+ this.set('fileContent', '');
+ this.set('startIndex', 0);
+ this.set('offset', 5000);
+ this.set('path', '');
+ this.set('isLoading', false);
+ this.set('hasError', false);
+ this.set('fileFetchFinished', false);
+ },
+
+ getNextContent: function () {
+ return this._getContent();
+ },
+
+ _getContent: function () {
+
+ var _self = this;
+
+ if (this.get('fileFetchFinished')) {
+ return false;
+ }
+
+ var adapter = this.get('store').adapterFor('file');
+ var baseURL = adapter.buildURL('file');
+ var renameUrl = baseURL.substring(0, baseURL.lastIndexOf('/'));
+ var previewUrl = renameUrl.substring(0, renameUrl.lastIndexOf('/')) + "/preview/file?path=";
+
+ var currentFetchPath = previewUrl + this.get('selected.path') + '&start=' + this.get('startIndex') + '&end=' + this.get('endIndex');
+
+ this.set('isLoading', true);
+
+ Ember.$.ajax({
+ url: currentFetchPath,
+ dataType: 'json',
+ type: 'get',
+ contentType: 'application/json',
+ success: this._fetchSuccess,
+ beforeSend: function (xhr) {
+ xhr.setRequestHeader('X-Requested-By', 'ambari');
+ xhr.setRequestHeader('Authorization', 'Basic YWRtaW46YWRtaW4=');
+ },
+ success: function (response, textStatus, jQxhr) {
+ _self.set('fileContent', _self.get('fileContent') + response.data);
+ _self.set('fileFetchFinished', response.isFileEnd);
+ _self.set('isLoading', false);
+
+ },
+ error: function (jQxhr, textStatus, errorThrown) {
+ console.log("Preview Fail pagecontent: " + errorThrown);
+ _self.set('hasError', true);
+ _self.set('isLoading', false);
+ }
+ })
+
+ this.set('startIndex', (this.get('startIndex') + this.get('offset')));
+
+ },
+
+ _fetchSuccess: function (response, textStatus, jQxhr) {
+ this.set('fileContent', this.get('fileContent') + response.data);
+ this.set('fileFetchFinished', response.isFileEnd);
+ this.set('isLoading', false);
+ },
+
+ _fetchError: function (jQxhr, textStatus, errorThrown) {
+ console.log("Preview Fail pagecontent: " + errorThrown);
+ this.set('hasError', true);
+ this.set('isLoading', false);
+ },
+
+ download: function (event) {
+ this.get('filesDownloadService').download();
+ }
+
+});
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/file-rename.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/file-rename.js b/contrib/views/files/src/main/resources/ui/app/services/file-rename.js
new file mode 100644
index 0000000..31109f0
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/file-rename.js
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FileOperationMixin from '../mixins/file-operation';
+
+export default Ember.Service.extend(FileOperationMixin, {
+ logger: Ember.inject.service('alert-messages'),
+
+ // Returns a promise for the operation. Upon sucess or error, this also
+ // appropriately sends error messages.
+ rename: function(srcPath, destName) {
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ var basePath = this.getBaseDirPath(srcPath);
+ var destPath = basePath + destName;
+ if(this._isDestinationPathExists(destPath)) {
+ var error = {success: false, message: `${destPath} already exists`, retry: true};
+ return reject(error);
+ }
+
+ var adapter = this.get('store').adapterFor('file');
+ var baseURL = adapter.buildURL('file');
+ var renameUrl = baseURL.substring(0, baseURL.lastIndexOf('/')) + "/rename";
+ var data = {src: srcPath, dst: destPath};
+ adapter.ajax(renameUrl, "POST", {data: data}).then((response) => {
+ this.get('logger').success(`Successfully renamed ${srcPath} to ${destPath}.`, {}, {flashOnly: true});
+ resolve(response);
+ }, (responseError) => {
+ var error = this.extractError(responseError);
+ this.get('logger').danger(`Failed to rename ${srcPath} to ${destPath}`, error);
+ reject(error);
+ });
+ });
+ },
+
+ _isDestinationPathExists(destinationPath) {
+ return this.get('store').peekAll('file').isAny('path', destinationPath);
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/files-download.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/files-download.js b/contrib/views/files/src/main/resources/ui/app/services/files-download.js
new file mode 100644
index 0000000..5b54bc0
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/files-download.js
@@ -0,0 +1,157 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import FileOperationMixin from '../mixins/file-operation';
+
+export default Ember.Service.extend(FileOperationMixin, {
+ fileSelectionService: Ember.inject.service('files-selection'),
+ logger: Ember.inject.service('alert-messages'),
+
+ download: function() {
+ var entries = this.get('fileSelectionService.files');
+ if(entries.length === 0) {
+ return this._downloadEmptyError();
+ } else if(entries.length === 1) {
+ return this._downloadSingle(entries);
+ } else {
+ return this._downloadMulti(entries);
+ }
+ },
+
+ concatenate: function() {
+ var entries = this.get('fileSelectionService.files');
+ if(entries.length === 0 || entries.length === 1) {
+ return this._concatenateNotPossibleError();
+ } else {
+ return this._concatenateFiles(entries);
+ }
+ },
+
+ _downloadSingle: function(entries) {
+ var entry = entries[0];
+ if(entry.get('isDirectory')) {
+ // There is no difference between downloading a single directory
+ // or multiple directories and file.
+ return this._downloadMulti(entries);
+ }
+ var adapter = this.get('store').adapterFor('file');
+ var data = {checkperm: true, path: entry.get('path')};
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ adapter.ajax(this._getDownloadBrowseUrl(), "GET", {data: data}).then(
+ (response) => {
+ if(response.allowed) {
+ window.location.href = this._getDownloadUrl(entry.get('path'));
+ resolve();
+ }
+ }, (rejectResponse) => {
+ var error = this.extractError(rejectResponse);
+ this.get('logger').danger("Failed to download file.", error);
+ reject(error);
+ });
+ });
+ },
+
+ _downloadMulti: function(entries) {
+ var entryPaths = entries.map((entry) => {
+ return entry.get('path');
+ });
+ var data = {download: true, entries: entryPaths};
+ var adapter = this.get('store').adapterFor('file');
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ adapter.ajax(this._getDownloadGenLinkUrl(), "POST", {data: data}).then(
+ (response) => {
+ var downloadZipLink = this._getDownloadZipUrl(response.requestId);
+ window.location.href = downloadZipLink;
+ resolve();
+ }, (rejectResponse) => {
+ //TODO: Need to do alerts and logging.
+ var error = this.extractError(rejectResponse);
+ this.get('logger').danger("Failed to download Zip.", error);
+ reject(error);
+ });
+ });
+ },
+
+ _concatenateFiles: function(entries) {
+ var entryPaths = entries.map((entry) => {
+ return entry.get('path');
+ });
+
+ var data = {download: true, entries: entryPaths};
+ var adapter = this.get('store').adapterFor('file');
+ return new Ember.RSVP.Promise((resolve, reject) => {
+ adapter.ajax(this._getConcatGenLinkUrl(), "POST", {data: data}).then(
+ (response) => {
+ var downloadConcatLink = this._getDownloadConcatUrl(response.requestId);
+ window.location.href = downloadConcatLink;
+ resolve();
+ }, (rejectResponse) => {
+ //TODO: Need to do alerts and logging.
+ var error = this.extractError(rejectResponse);
+ this.get('logger').danger("Failed to concatenate files.", error);
+ reject(error);
+ });
+ });
+ },
+
+ _downloadEmptyError: function() {
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ reject("No files to download.");
+ });
+ },
+ _concatenateNotPossibleError: function() {
+ return new Ember.RSVP.Promise(function(resolve, reject) {
+ reject("Cannot concatenate zero or single file.");
+ });
+ },
+
+ _getDownloadGenLinkUrl: function() {
+ var urlFragments = this._getBaseURLFragments();
+ return urlFragments.slice(0, urlFragments.length - 2).join('/') + "/download/zip/generate-link";
+ },
+
+ _getDownloadZipUrl: function(requestId) {
+ var genLinkUrl = this._getDownloadGenLinkUrl();
+ return genLinkUrl.substring(0, genLinkUrl.lastIndexOf('/')) + "?requestId=" + requestId;
+ },
+
+ _getDownloadBrowseUrl: function() {
+ var urlFragments = this._getBaseURLFragments();
+ return urlFragments.slice(0, urlFragments.length - 2).join('/') + "/download/browse";
+ },
+
+ _getDownloadUrl: function(path) {
+ return this._getDownloadBrowseUrl() + "?path=" + path + "&download=true";
+ },
+
+ _getConcatGenLinkUrl: function() {
+ var urlFragments = this._getBaseURLFragments();
+ return urlFragments.slice(0, urlFragments.length - 2).join('/') + "/download/concat/generate-link";
+ },
+
+ _getDownloadConcatUrl: function(requestId) {
+ var genLinkUrl = this._getConcatGenLinkUrl();
+ return genLinkUrl.substring(0, genLinkUrl.lastIndexOf('/')) + "?requestId=" + requestId;
+ },
+
+ _logError: function(message, error) {
+ this.get('logger').danger(message, error);
+ }
+
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/files-selection.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/files-selection.js b/contrib/views/files/src/main/resources/ui/app/services/files-selection.js
new file mode 100644
index 0000000..724c72a
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/files-selection.js
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Service.extend({
+ files: [],
+ lastFileSelected: null,
+ filesCount: Ember.computed('files.[]', function() {
+ return this.get('files').filterBy('isDirectory', false).length;
+ }),
+ folderCount: Ember.computed('files.[]', 'filesCount', function() {
+ return this.get('files.length') - this.get('filesCount');
+ }),
+
+ selectFiles: function(files) {
+ files.forEach((file) => {
+ file.set('isSelected', true);
+ this.get('files').pushObject(file);
+ this.set('lastFileSelected', file);
+ });
+ },
+
+ deselectFile: function(file) {
+
+ if (file.get('isSelected')) {
+ file.set('isSelected', false);
+ }
+
+ this.set('files', this.get('files').without(file));
+ if(file === this.get('lastFileSelected')) {
+ this.set('lastFileSelected', this.get('files').objectAt(this.get('files.length') - 1));
+ }
+
+ },
+
+ deselectAll: function() {
+ this.get('files').forEach((file) => {
+ file.set('isSelected', false);
+ });
+ this.set('files', []);
+ this.set('lastFileSelected');
+ },
+
+ reset: function() {
+ this.set('files', []);
+ this.set('lastFileSelected');
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/services/modal-event-bus.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/services/modal-event-bus.js b/contrib/views/files/src/main/resources/ui/app/services/modal-event-bus.js
new file mode 100644
index 0000000..aa9075f
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/services/modal-event-bus.js
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+
+export default Ember.Service.extend({
+ registerModal: function(modalControlProperty) {
+ if(Ember.isBlank(modalControlProperty) || (typeof modalControlProperty !== 'string')) {
+ Ember.assert("Modal: Can only register with a 'String' control property name.", false);
+ return false;
+ }
+ if(typeof this.get(modalControlProperty) !== 'undefined') {
+ Ember.assert("Modal: '" + modalControlProperty + "' has already been registered.", false);
+ return false;
+ }
+ this.set(modalControlProperty, false);
+ },
+
+ showModal: function(modalControlProperty) {
+ if(Ember.isBlank(modalControlProperty) || (typeof modalControlProperty !== 'string')) {
+ Ember.assert("Modal: Can only use 'String' control property name for showing modal.", false);
+ return false;
+ }
+ this.set(modalControlProperty, true);
+ },
+ resetModal: function(modalControlProperty) {
+ if(Ember.isBlank(modalControlProperty) || (typeof modalControlProperty !== 'string')) {
+ Ember.assert("Modal: Can only use 'String' control property name for reset modal.", false);
+ return false;
+ }
+ this.set(modalControlProperty);
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/styles/app.less
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/styles/app.less b/contrib/views/files/src/main/resources/ui/app/styles/app.less
new file mode 100644
index 0000000..55327e9
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/styles/app.less
@@ -0,0 +1,188 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@import 'bootstrap';
+
+// Component customizations
+@border-radius-base: 2px;
+@border-radius-large: 3px;
+@border-radius-small: 1.5px;
+
+// Breadcrumb customizations
+@breadcrumb-bg: @body-bg;
+@breadcrumb-separator: ">";
+.breadcrumb {
+ display: inline;
+ padding-left: 5px;
+ li {
+ position: relative;
+ top: 2px;
+ }
+}
+
+
+// Dropdown customizations
+@dropdown-link-hover-color: @link-hover-color;
+@dropdown-link-color: @link-color;
+
+body {
+ min-width: 1150px;
+ min-height: 800px;
+}
+
+.container-wrap {
+ margin-top: 5px;
+}
+
+
+.files-header {
+ padding-bottom: 10px;
+ border-bottom: 2px solid lighten(@gray-light, 25%);
+}
+
+.file-row {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid darken(@gray-lighter, 5%);
+ -webkit-user-select: none; /* Chrome all / Safari all */
+ -moz-user-select: none; /* Firefox all */
+ -ms-user-select: none; /* IE 10+ */
+ user-select: none;
+ &:hover {
+ background-color: @table-bg-hover;
+ }
+}
+.row-selected {
+ background-color: lighten(@component-active-bg, 40%) !important;
+}
+
+
+
+.context-text-row {
+ position: absolute;
+ .context-text {
+ position: relative;
+ display: inline-block;
+ padding: 5px 20px;
+ background: darken(@state-warning-bg, 25%);
+ border: 1px solid @state-warning-border;
+ border-radius: @border-radius-large;
+ }
+}
+
+.context-menu-row {
+ padding-top: 5px;
+ li > a {
+ text-decoration: none;
+ }
+ li.disabled > a {
+ color: @gray-light;
+ cursor: default;
+ }
+
+ .context-menu-entries {
+ margin-bottom: 0px;
+ }
+}
+
+.flash-messages-wrap {
+ position: absolute;
+ width: 40%;
+ min-width: 575px;
+ left: 50%;
+ margin-left: -20%;
+ z-index: 1000;
+}
+
+.flash-messages {
+ border-radius: @border-radius-large;
+ .alert-icon {
+ float: left;
+ margin-right: 15px;
+ }
+
+ .alert-message-wrap {
+ display: table;
+ min-height: 56px;
+ .alert-message {
+ display: table-cell;
+ vertical-align: middle;
+ }
+ }
+
+}
+
+
+
+.spinner-wrap {
+ margin-right: 15px;
+}
+
+.file-picker {
+ .file-picker__dropzone {
+ color: @gray-light;
+ cursor: pointer;
+ border: 2px dashed darken(@gray-lighter, 10%);
+ height: 150px;
+ .vert-align-middle {
+ margin-top: 32px;
+ }
+ }
+}
+.file-picker-progress {
+ margin-bottom: 5px;
+}
+
+.loading-spinner {
+ margin-top: 150px;
+}
+.loading-message {
+ padding-top: 5px;
+ padding-bottom: 5px;
+ margin-top: 7px;
+ position: fixed;
+ top: 0px;
+ z-index: 1000;
+ border-radius: @border-radius-large;
+ background-color: darken(@state-warning-bg, 25%);
+}
+
+.well-sm {
+ margin-bottom: 10px;
+}
+
+.messages-header {
+ padding-bottom: 5px;
+ margin-bottom: 5px;
+ border-bottom: 1px solid darken(@gray-lighter, 5%);
+}
+
+.messages-title {
+ font-size: 26px;
+}
+
+.directory-viewer {
+ height: 300px;
+ overflow-x: scroll;
+ overflow-y: scroll;
+ border:1px solid #e5e5e5;
+}
+
+div.text-danger pre{
+ color: #a94442;
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/styles/application.less
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/styles/application.less b/contrib/views/files/src/main/resources/ui/app/styles/application.less
deleted file mode 100644
index b41fa2e..0000000
--- a/contrib/views/files/src/main/resources/ui/app/styles/application.less
+++ /dev/null
@@ -1,388 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-.wrap {
- padding: 10px;
-}
-
-.panel-files {
- .panel-heading {
- height: 41px;
- padding: 5px 10px;
- border-radius: 0px;
- border: 1px solid #DDDDDD;
-
- .breadcrumb {
- margin-bottom: 0;
- padding: 5px 10px;
- //background-color: #fff;
-
- .active a {
- color: #999999 !important;
- }
-
- li:first-child + li:before {
- padding: 0 3px;
- content: " ";
- }
- }
-
- .upload-area, .mkdir-area{
- // margin: -4px 5px -4px 5px;
- width: 350px;
- margin-right: 5px;
- }
- .uploadwrap, .mkdirwrap{
- margin-right: 5px;
- }
- .btn-mkdir-cancel {
- border-radius: 0 !important;
- margin-left: -1px;
- }
- .mkdir-input{
- font-size: 14px;
- }
- .btn-upload {
- button {
- border-radius:0 !important;
- }
- }
- }
-
- .panel-body {
- .i-am-in {
- margin: 0;
- width: 80%;
- .dir-name {
- color: black;
- }
- }
- .input-group-search {
- .input-search {
- padding-right: 25px;
- }
- .form-control-feedback {
- position: absolute;
- z-index: 2;
- top: 8px;
- right: 39px;
- cursor: pointer;
- opacity: 0.5;
- }
- }
- }
-
- .table-files{
- td {
- cursor: pointer;
- }
- thead {
- background-color: #f5f5f5;
- }
- thead > tr > th {
- border-bottom: 1px solid #dddddd;
- border-top: 1px solid #dddddd !important;
- }
- thead tr th.icon {
- width: 2%;
- }
- thead tr th.path {
- cursor: pointer;
- width: 30%;
- }
- thead tr th.size {
- cursor: pointer;
- width: 10%;
- }
- thead tr th.date {
- cursor: pointer;
- width: 20%;
- }
- thead tr th.owner {
- cursor: pointer;
- width: 10%;
- }
- thead tr th.grp {
- cursor: pointer;
- width: 10%;
- }
- thead tr th.perm {
- cursor: pointer;
- width: 10%;
- }
- thead tr th.download {
- width: 2%;
- .btn-group{
- width: 145px;
- }
- }
- thead tr th.check{
- width: 2%;
- .btn-group {
- width: 50px;
- .input-group-addon {
- padding: 2px 17px 1px 5px;
- position: relative;
- float: left;
- }
- .checkbox {
- margin: 0;
- min-height: 17px;
- }
- }
- }
- tbody {
- .error-row{
- td {
- padding: 0;
- border: 0;
- & > div {
- border-top: 1px solid #DDDDDD;
- padding: 8px;
- color: #a94442;
- word-break: break-word;
- }
- }
- }
- .fa-spin {
- -webkit-animation: spin 0.7s infinite linear;
- -moz-animation: spin 0.7s infinite linear;
- -o-animation: spin 0.7s infinite linear;
- animation: spin 0.7s infinite linear;
- }
- .chmod-row {
- &:hover > td {
- background-color: #fff;
- cursor: default;
- }
- & > td {
- border-top: 0;
- padding: 0;
- }
-/* .chmod-wrap {
- transition: all 0.3s ease;
- opacity: 1;
- margin-right: 0px;
- height: 32px;
- overflow: hidden;
- padding-top: 5px;
-} */
- }
- .btn-delete {
- .popover-content{
- width: 80px;
- }
- }
- .levelup {
- text-align: center;
- }
- .levelup:hover {
- background-color: #dddddd;
- }
- tr {
- &.isMoving {
- opacity: 0.5;
- }
- td {
- vertical-align: middle;
- }
- .file-actions{
- width: 130px;
- margin-bottom: 0;
- .delete-forever {
- float: right;
- margin: 0px 0px 0 10px;
- }
- }
- .mod-time{
- margin: 0;
- }
- .file-name {
- margin-top: -5px;
- margin-bottom: -5px;
- }
- .rename-area {
- //margin: -4px;
- }
- .btn-rename {
- display: none;
- }
- &:hover .btn-rename {
- display: inline-block;
- }
- .btn-rename-cancel {
- border-radius: 0 !important;
- margin-left: -1px;
- }
- .rename-input{
- font-size: 14px;
- }
- }
- }
- }
-
-}
-
-
-.btn-file {
- position: relative;
- overflow: hidden;
-}
-.btn-file input[type=file] {
- position: absolute;
- top: 0;
- right: 0;
- min-width: 100%;
- min-height: 100%;
- font-size: 999px;
- text-align: right;
- filter: alpha(opacity=0);
- opacity: 0;
- outline: none;
- background: white;
- cursor: inherit;
- display: block;
-}
-
-.dropdown-submenu {
- position:relative;
- & > a {
- white-space: normal !important;
- }
- & > .dropdown-menu {
- top:0;
- left:100%;
- margin-top:-6px;
- margin-left:-1px;
- -webkit-border-radius:0 6px 6px 6px;
- -moz-border-radius:0 6px 6px 6px;
- border-radius:0 6px 6px 6px;
- }
- &:hover > .dropdown-menu {
- display:block;
- }
- &.pull-left {
- float:none;
- & > .dropdown-menu {
- left:-100%;
- margin-left:10px;
- }
- }
- & > .left-submenu {
- -webkit-border-radius:6px 0 6px 6px;
- -moz-border-radius:6px 0 6px 6px;
- border-radius:6px 0 6px 6px;
- float: right;
- right: 100%;
- left: inherit;
- }
-}
-
-#bulkDropdown {
- .sub-label{
- display: inline-block;
- width: 55%;
- }
-}
-
-#context-menu {
- .sub-label{
- display: inline-block;
- width: 55%;
- }
- .dropdown-confirm {
- margin: -4px 8px;
- }
-}
-
-.dropdown-confirm {
- margin: -4px 0;
-}
-
-
-.fa-right {
- top: 3px;
- position: relative;
- color: #cccccc;
-}
-
-.fa-gr {
- color: #ccc;
-}
-
-
-.dropdown-context {
- .nav-header{
- cursor:default;
- }
- .dropdown-submenu:hover {
- .dropdown-menu {
- display: none;
- }
- & > .dropdown-menu {
- display: block;
- }
- }
-}
-
-.dropdown-context-sub:before, .dropdown-context-sub:after{
- display:none;
-}
-.compressed-context {
- a {
- padding-left: 14px;
- padding-top: 0;
- padding-bottom: 0;
- font-size: 13px;
- }
- .divider {
- margin: 5px 1px;
- }
- .nav-header {
- padding:1px 13px;
- }
-}
-
-.renameable {
- display: inline-block;
- &.half {
- width: 50%;
- }
- &.stocked {
- margin-top: -12px;
- margin-bottom: -12px;
- }
- .form-control {
- font-size: 14px;
- }
- .mod-time{
- margin: 0;
- }
- .file-name {
- margin-top: -5px;
- margin-bottom: -5px;
- }
- .btn-rename-cancel {
- border-radius: 0 !important;
- margin-left: -1px;
- }
-}
-.modal-backdrop.in {
- filter: alpha(opacity=0);
- opacity: 0;
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/application.hbs b/contrib/views/files/src/main/resources/ui/app/templates/application.hbs
index 5ce40eb..543c4ff 100644
--- a/contrib/views/files/src/main/resources/ui/app/templates/application.hbs
+++ b/contrib/views/files/src/main/resources/ui/app/templates/application.hbs
@@ -1,21 +1,37 @@
{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
}}
-<div class="wrap">
+<div class="container-fluid container-wrap">
+ <div class="row">
+ <div class="flash-messages-wrap">
+ {{#each flashMessages.queue as |flash|}}
+ {{alert-message flash=flash}}
+ {{/each}}
+ </div>
+
+ </div>
+ {{#if isLoading}}
+ <div class="row">
+ <div class="col-md-2 col-xs-2 col-md-offset-5 col-xs-offset-5 loading-message text-center">
+ {{fa-icon icon="spinner" spin=true}} Loading
+ </div>
+ </div>
+ {{/if}}
{{outlet}}
</div>
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/.gitkeep
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/.gitkeep b/contrib/views/files/src/main/resources/ui/app/templates/components/.gitkeep
new file mode 100644
index 0000000..e69de29
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/alert-message-display.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/alert-message-display.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/alert-message-display.hbs
new file mode 100644
index 0000000..8dfa913
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/alert-message-display.hbs
@@ -0,0 +1,34 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+
+<p><strong>{{{title}}}</strong></p>
+<div>
+ <pre class="prettyprint">
+ <small>
+ {{shortenedValue}}
+ {{#if shorten}}
+ {{#unless expanded}}
+ <a href="#" {{action "toggleExpanded"}}>(more...)</a>
+ {{else}}
+ <a href="#" {{action "toggleExpanded"}}>(less...)</a>
+ {{/unless}}
+ {{/if}}
+ </small>
+ </pre>
+</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/alert-message.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/alert-message.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/alert-message.hbs
new file mode 100644
index 0000000..29a5fa0
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/alert-message.hbs
@@ -0,0 +1,34 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<div class={{alert-message-context-class flash.type "clearfix alert alert-dismissible alert-"}}>
+ <button type="button" class="close" {{action "closeAlert"}}><span aria-hidden="true">×</span></button>
+ <div class="alert-icon">
+ {{#fa-stack size=2}}
+ {{fa-icon "circle-thin" stack=2}}
+ {{fa-icon (alert-message-icon-class flash.type) stack=1}}
+ {{/fa-stack}}
+ </div>
+ <div class="alert-message-wrap">
+ <div class="alert-message">
+ {{{flash.message}}}
+ </div>
+ </div>
+
+</div>
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/chmodInput.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/chmodInput.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/chmodInput.hbs
deleted file mode 100644
index 4805e65..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/components/chmodInput.hbs
+++ /dev/null
@@ -1,100 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-<td colspan="8" class="">
-
-<div class="modal chmodal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static">
- <div class="modal-dialog modal-sm">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
- <h4 class="modal-title">Edit permission</h4>
- </div>
- <div class="modal-body">
-
- <form class="form-horizontal" role="form">
- <div class="form-group">
- <label class="col-sm-2 control-label">User</label>
- <div class="col-sm-10">
- <div class="btn-group" data-toggle="buttons">
- <label {{bind-attr class=":btn :btn-sm usrR:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=usrR}} <span>Read</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm usrW:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=usrW}} <span>Write</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm usrE:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=usrE}} <span>Execute</span>
- </label>
- </div>
- </div>
- </div>
- <div class="form-group">
- <label class="col-sm-2 control-label">Group</label>
- <div class="col-sm-10">
- <div class="btn-group" data-toggle="buttons">
- <label {{bind-attr class=":btn :btn-sm grpR:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=grpR}} <span>Read</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm grpW:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=grpW}} <span>Write</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm grpE:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=grpE}} <span>Execute</span>
- </label>
- </div>
- </div>
- </div>
- <div class="form-group">
- <label class="col-sm-2 control-label">Other</label>
- <div class="col-sm-10">
- <div class="btn-group" data-toggle="buttons">
- <label {{bind-attr class=":btn :btn-sm otrR:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=otrR}} <span>Read</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm otrW:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=otrW}} <span>Write</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm otrE:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=otrE}} <span>Execute</span>
- </label>
- </div>
- </div>
- </div>
-
- <div class="form-group">
- <div class="col-sm-offset-2 col-sm-10">
- <div class="checkbox">
- <label>
- {{input type="checkbox"}} <span> Modify recursively</span>
- </label>
- </div>
- </div>
- </div>
- </form>
-
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" {{action 'close'}}>Close</button>
- <button type="button" class="btn btn-primary" {{action 'confirm'}}>Save changes</button>
- </div>
- </div>
- </div>
-</div>
-
-</td>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/context-row-menu.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/context-row-menu.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/context-row-menu.hbs
new file mode 100644
index 0000000..6a52f33
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/context-row-menu.hbs
@@ -0,0 +1,39 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if isSelected}}
+ <div class="col-md-12">
+ <ul class="list-inline context-menu-entries">
+ <li class={{if isMultiSelected "disabled"}}><a href="#" {{action "open"}}>{{fa-icon "folder-open-o" size="lg"}} Open</a></li>
+ <li class={{if isMultiSelected "disabled"}}><a href="#" {{action "rename"}}>{{fa-icon "edit" size="lg"}} Rename</a></li>
+ <li class={{if isMultiSelected "disabled"}}><a href="#" {{action "permission"}}>{{fa-icon "lock" size="lg"}} Permissions</a></li>
+ <li><a href="#" {{action "delete"}}>{{fa-icon "trash" size="lg"}} Delete</a></li>
+ <li><a href="#" {{action "copy"}}>{{fa-icon "file-o" size="lg"}} Copy </a></li>
+ <li><a href="#" {{action "move"}}>{{fa-icon "share" size="lg"}} Move </a></li>
+ <li><a href="#" {{action "download"}}>{{fa-icon "download" size="lg"}} Download </a></li>
+ <li class={{unless isOnlyMultiFilesSelected "disabled"}}><a href="#" {{action "concatenate"}}>{{fa-icon "file-text" size="lg"}} concatenate </a></li>
+ </ul>
+
+ {{copy-modal closeModalAction="modalClosed" name="ctx-copy"}}
+ {{move-modal closeModalAction="modalClosed" refreshAction="refreshCurrentRoute" name="ctx-move"}}
+ {{open-preview-modal closeModalAction="modalClosed" name="ctx-open"}}
+ {{rename-modal closeModalAction="modalClosed" refreshAction="refreshCurrentRoute" name="ctx-rename"}}
+ {{delete-modal closeModalAction="modalClosed" refreshAction="refreshCurrentRoute" name="ctx-delete" currentPathIsTrash=currentPathIsTrash}}
+ {{permission-modal closeModalAction="modalClosed" name="ctx-permission"}}
+ </div>
+{{/if}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/contextMenu.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/contextMenu.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/contextMenu.hbs
deleted file mode 100644
index 2cd6303..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/components/contextMenu.hbs
+++ /dev/null
@@ -1,43 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-{{#dropdown-wrap}}
-<div id="context-menu">
- <ul class="dropdown-menu dropdown-context compressed-context" role="menu">
- {{#if view.target.content.isDirectory}}
- <li><a tabindex="-1" href="#" {{action 'open'}}>Open folder</a></li>
- {{else}}
- <li><a tabindex="-1" href="#" {{action 'download'}}>Download</a></li>
- {{/if}}
- <li><a tabindex="-1" href="#" {{action 'moveFile' 'cut' view.target.content}}>Move</a></li>
- <li><a tabindex="-1" href="#" {{action 'showChmod'}} >Permissions</a></li>
- <li><a tabindex="-1" href="#" {{action 'editName'}} >Rename</a></li>
- <li class="divider"></li>
- <li class="dropdown-submenu">
- <a href="#" data-disabled="disabled">
- <span> Delete </span>
- <i class="fa fa-chevron-right pull-right fa-right"></i>
- </a>
- <ul class="dropdown-menu">
- {{confirm-delete confirm="removeFile" deleteForever=true access=true}}
- {{confirm-delete confirm="moveToTrash" deleteForever=false access=true}}
- </ul>
- </li>
- </ul>
-</div>
-{{/dropdown-wrap}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/copy-modal.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/copy-modal.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/copy-modal.hbs
new file mode 100644
index 0000000..3e561e5
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/copy-modal.hbs
@@ -0,0 +1,87 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if modalGuard}}
+ <div class="modal fade" tabindex=-1 role="dialog">
+ <div class="modal-dialog modal-lg">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">×</button>
+ <h3 class="modal-title">Copy to <span style="font-weight: normal; font-size: 14px;">{{selectionName}}</span>
+ </h3>
+ <div class="text-danger">
+ {{#if browseError}}
+ {{alert-message-display title="Error: "
+ value=browseErrorMessage
+ shorten=true
+ length=100}}
+ {{/if}}
+ </div>
+
+ </div>
+ <div class="modal-body">
+ {{#unless isUpdating}}
+ {{#unless hasError}}
+ {{directory-viewer pathSelectAction="pathSelected" errorAction="browseError"}}
+ {{else}}
+ <div class="text-danger">
+ {{alert-message-display title="Error: "
+ value=currentFailureMessage
+ shorten=true
+ length=100}}
+ </div>
+ {{/unless}}
+ {{else}}
+ <div class="text-center">
+ {{fa-icon "spinner" spin=true size="2"}}
+ </div>
+ {{/unless}}
+ </div>
+ <div class="modal-footer">
+ {{#unless hasError}}
+ <button type="button"
+ class="btn btn-default {{if isUpdating "disabled"}}" {{action 'close'}}>{{fa-icon icon="close"}}
+ Cancel
+ </button>
+ <button type="submit"
+ class="btn btn-primary {{if isUpdating "disabled"}}" {{action 'copy'}}>{{fa-icon icon="share"}} Copy
+ </button>
+
+ {{else}}
+ {{#unless shouldRetry}}
+ <button type="button" class="btn btn-default"
+ disabled={{isUpdating}} {{action "close"}}>{{fa-icon "remove"}} Cancel
+ </button>
+ {{/unless}}
+ <button type="button" class="btn btn-danger"
+ disabled={{isUpdating}} {{action "retryError"}}>{{fa-icon "refresh"}} Retry
+ </button>
+ {{#if shouldRetry}}
+ <button type="button" class="btn btn-danger"
+ disabled={{isUpdating}} {{action "skipAndRetry"}}>{{fa-icon "step-forward"}} Skip
+ </button>
+ <button type="button" class="btn btn-danger"
+ disabled={{isUpdating}} {{action "skipAll"}}>{{fa-icon "fast-forward"}} Skip All
+ </button>
+ {{/if}}
+ {{/unless}}
+ </div>
+ </div>
+ </div>
+ </div>
+{{/if}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/delete-modal.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/delete-modal.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/delete-modal.hbs
new file mode 100644
index 0000000..207a2a8
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/delete-modal.hbs
@@ -0,0 +1,69 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if modalGuard}}
+ <div class="modal fade" tabindex=-1 role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">×</button>
+ <h4 class="modal-title">{{fa-icon icon="trash"}} Delete</h4>
+ </div>
+ <div class="modal-body">
+ {{#unless isDeleting}}
+ {{#unless hasError}}
+ <p class="lead">Are you sure you want to delete{{#if hasFiles}} {{filesCount}} file(s){{#if hasFolders}} and {{/if}}{{/if}}{{#if hasFolders}} {{folderCount}} folder(s) {{/if}}?</p>
+ {{#if showDeletePermanentCheckbox}}
+ <div class="checkbox">
+ <label>
+ {{input type="checkbox" checked=deletePermanently}} <strong>Delete permanently</strong>
+ </label>
+ </div>
+ {{/if}}
+ {{else}}
+ <p class="text-danger">{{{currentFailureMessage}}}</p>
+ {{alert-message-display title="Details:"
+ value=currentServerFailureMessage
+ shorten=true
+ length=100}}
+ {{/unless}}
+ {{else}}
+ <div class="text-center">
+ {{fa-icon "spinner" spin=true size="2"}}
+ </div>
+ {{/unless}}
+ </div>
+ <div class="modal-footer">
+ {{#unless hasError}}
+ <button type="button" class="btn btn-default" disabled={{isDeleting}} {{action "close"}}>{{fa-icon "remove"}} Cancel</button>
+ <button type="button" class="btn btn-danger" disabled={{isDeleting}} {{action "delete"}}>{{fa-icon "trash"}} Delete</button>
+ {{else}}
+ {{#unless shouldRetry}}
+ <button type="button" class="btn btn-default" disabled={{isDeleting}} {{action "close"}}>{{fa-icon "remove"}} Cancel</button>
+ {{/unless}}
+ <button type="button" class="btn btn-danger" disabled={{isDeleting}} {{action "retryError"}}>{{fa-icon "refresh"}} Retry</button>
+ {{#if shouldRetry}}
+ <button type="button" class="btn btn-danger" disabled={{isDeleting}} {{action "skipAndRetry"}}>{{fa-icon "step-forward"}} Skip</button>
+ <button type="button" class="btn btn-danger" disabled={{isDeleting}} {{action "skipAll"}}>{{fa-icon "fast-forward"}} Skip All</button>
+ {{/if}}
+ {{/unless}}
+ </div>
+ </div>
+ </div>
+ </div>
+{{/if}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/deleteBulk.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/deleteBulk.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/deleteBulk.hbs
deleted file mode 100644
index e7e6c69..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/components/deleteBulk.hbs
+++ /dev/null
@@ -1,46 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-{{#if isRemoving}}
-<a tabindex="-1">
- {{#if deleteForever}}
- <i class="fa fa-fw fa-exclamation-triangle"></i>
- <span class="sub-label" > Delete forever </span>
- {{else}}
- <i class="fa fa-fw fa-trash-o"></i>
- <span class="sub-label" >Move To Trash</span>
- {{/if}}
- <div class="btn-group text-center dropdown-confirm">
- <button {{action 'cancel'}} type="button" class="btn btn-xs btn-danger">
- <span class="glyphicon glyphicon-remove"></span>
- </button>
- <button {{action 'confirm'}} type="button" class="btn btn-xs btn-success delete">
- <span class="glyphicon glyphicon-ok delete"></span>
- </button>
- </div>
-</a>
-{{else}}
-<a {{action 'ask'}} tabindex="-1" href="#">
- {{#if deleteForever}}
- <i class="fa fa-fw fa-exclamation-triangle"></i> <span class="sub-label" > Delete forever </span>
- {{else}}
- <i class="fa fa-fw fa-trash-o"></i> <span class="sub-label" >Move To Trash</span>
- {{/if}}
-</a>
-{{/if}}
-
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/deletePopover.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/deletePopover.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/deletePopover.hbs
deleted file mode 100644
index e5f3b9a..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/components/deletePopover.hbs
+++ /dev/null
@@ -1,38 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-<a data-toggle="tooltip" data-placement="bottom" title="Delete"> <i class="fa fa-trash-o fa-lg"></i> </a>
-
-{{#bs-popover triggers='click' placement='left'}}
- <div class="input-group" >
- <div class="btn-group ">
- <button {{action 'close'}} type="button" class="btn btn-xs btn-danger">
- <i class="fa fa-times fa-fw"></i>
- </button>
- <button {{action 'confirm'}} type="button" class="btn btn-xs btn-success">
- <i class="fa fa-check fa-fw"></i>
- </button>
- </div>
- <div class="checkbox delete-forever">
- <label>
- {{input type="checkbox" checkedBinding='deleteForever' }} Delete forever
- </label>
- </div>
- </div>
-{{/bs-popover}}
-
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/directory-viewer.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/directory-viewer.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/directory-viewer.hbs
new file mode 100644
index 0000000..6671b8b
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/directory-viewer.hbs
@@ -0,0 +1,17 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/file-row.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/file-row.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/file-row.hbs
new file mode 100644
index 0000000..2976cf9
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/file-row.hbs
@@ -0,0 +1,46 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<div class="row">
+ <div class={{get-value-from-columns columnHeaders 'name' 'columnClass'}}>
+ {{#if file.isDirectory}}
+ {{#link-to 'files' (query-params path=file.path) bubbles=false title=file.name}}{{fa-icon "folder-o"}} {{shorten-text file.name 40}} {{/link-to}}
+ {{else}}
+ <span title={{ file.name }}>{{fa-icon "file-o"}} {{shorten-text file.name 40}}</span>
+ {{/if}}
+ </div>
+ <div class={{get-value-from-columns columnHeaders 'size' 'columnClass'}}>
+ {{#unless file.isDirectory}}
+ {{size-humanize file.size}}
+ {{else}}
+ --
+ {{/unless}}
+ </div>
+ <div class={{get-value-from-columns columnHeaders 'date' 'columnClass'}}>
+ {{show-date file.modificationTime 'YYYY-MM-DD HH:mm'}}
+ </div>
+ <div class={{get-value-from-columns columnHeaders 'owner' 'columnClass'}}>
+ {{file.owner}}
+ </div>
+ <div class={{get-value-from-columns columnHeaders 'group' 'columnClass'}}>
+ {{file.group}}
+ </div>
+ <div class={{get-value-from-columns columnHeaders 'permission' 'columnClass'}}>
+ {{file.permission}}
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/file-search.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/file-search.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/file-search.hbs
new file mode 100644
index 0000000..298d672
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/file-search.hbs
@@ -0,0 +1,20 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{input type="text" placeholder="Search in current directory..." class="form-control input-sm" value=searchText}}
+<span class="input-group-addon">{{fa-icon icon='search'}}</span>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/files-breadcrumb.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/files-breadcrumb.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/files-breadcrumb.hbs
new file mode 100644
index 0000000..2d0e961
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/files-breadcrumb.hbs
@@ -0,0 +1,42 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if collapsingRequired}}
+ <li>
+ <div class="dropdown">
+ <a class="dropdown-toggle" d="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
+ {{#fa-stack}}
+ {{fa-icon "folder-o" stack=2}}
+ {{fa-icon "caret-down" stack=1}}
+ {{/fa-stack}}
+ </a>
+ <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
+ {{#each collapsedCrumbs as |crumb|}}
+ <li>{{#link-to 'files' (query-params path=crumb.path) title=crumb.name }}{{fa-icon "folder-o"}} {{shorten-text crumb.name 20}}{{/link-to}}</li>
+ {{/each}}
+ </ul>
+ </div>
+ </li>
+{{/if}}
+{{#each expandedCrumbs as |crumb|}}
+ {{#if crumb.last}}
+ <li class="active"><span title={{crumb.name}}>{{shorten-text crumb.name 20}}</span></li>
+ {{else}}
+ <li>{{#link-to 'files' (query-params path=crumb.path) title=crumb.name }}{{shorten-text crumb.name 20}}{{/link-to}}</li>
+ {{/if}}
+{{/each}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/files-collection.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/files-collection.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/files-collection.hbs
new file mode 100644
index 0000000..0dcc15b
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/files-collection.hbs
@@ -0,0 +1,53 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<div class="row">
+ <div class="col-md-12 col-xs-12 files-header">
+ {{#each columnsConfig as |column|}}
+ <div class={{column.columnClass}} {{action 'rotateSort' column}}>
+ <strong>{{column.title}}</strong>
+ {{#if sortEnabled}}
+ {{#if column.sortable}}
+ <span class="">{{fa-icon icon=(get-sorting-icon column.sortOrder)}}</span>
+ {{/if}}
+ {{/if}}
+ </div>
+ {{/each}}
+ </div>
+</div>
+
+<div class="row">
+ <div class="col-md-12 col-xs-12">
+ {{#unless isEmptyParentPath}}
+ <div class="row">
+ <div class="col-md-12 col-xs-12">
+ {{#link-to 'files' (query-params path=parentPath)}}
+ <div class="col-md-12 col-xs-12 file-row">
+ {{fa-icon "fa-reply"}}
+ </div>
+ {{/link-to}}
+ </div>
+ </div>
+ {{/unless}}
+ <div style={{containerStyle}}>
+ {{#ember-collection items=items cell-layout=(fixed-grid-layout currentWidth 41) as |file index|}}
+ {{yield file index}}
+ {{/ember-collection}}
+ </div>
+ </div>
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/mkdirInput.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/mkdirInput.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/mkdirInput.hbs
deleted file mode 100644
index 14176f9..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/components/mkdirInput.hbs
+++ /dev/null
@@ -1,37 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-{{#unless isMkdir}}
- <button type="button" {{action 'edit'}} {{bind-attr class=":btn :btn-default :btn-sm :pull-right :mkdirwrap canCreate::disabled"}}>
- <i class="fa fa-plus"></i> New directory
- </button>
-{{else}}
- <div class="input-group input-group-sm pull-right mkdir-area">
- {{input class="form-control mkdir-input" valueBinding='newDirName' placeholder="Enter Directory Name" enter='create'}}
- <div class="input-group-btn">
- <button type="button" {{action 'cancel'}} {{bind-attr class=":btn :btn-danger :btn-sm :btn-mkdir-cancel"}} >
- <i class="fa fa-times"></i> Cancel
- </button>
- </div>
- <div class="input-group-btn">
- <button type="button" {{action 'create'}} {{bind-attr class="newDirName::disabled :btn :btn-success :btn-sm :btn-mkdir"}} >
- <i class="fa fa-check"></i> Create
- </button>
- </div>
- </div>
-{{/unless}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/move-modal.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/move-modal.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/move-modal.hbs
new file mode 100644
index 0000000..1655930
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/move-modal.hbs
@@ -0,0 +1,87 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if modalGuard}}
+ <div class="modal fade" tabindex=-1 role="dialog">
+ <div class="modal-dialog modal-lg">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">×</button>
+ <h3 class="modal-title">Move to <span style="font-weight: normal; font-size: 14px;">{{selectionName}}</span>
+ </h3>
+ <div class="text-danger">
+ {{#if browseError}}
+ {{alert-message-display title="Error: "
+ value=browseErrorMessage
+ shorten=true
+ length=100}}
+ {{/if}}
+ </div>
+
+ </div>
+ <div class="modal-body">
+ {{#unless isUpdating}}
+ {{#unless hasError}}
+ {{directory-viewer pathSelectAction="pathSelected" errorAction="browseError"}}
+ {{else}}
+ <div class="text-danger">
+ {{alert-message-display title="Error: "
+ value=currentFailureMessage
+ shorten=true
+ length=100}}
+ </div>
+ {{/unless}}
+ {{else}}
+ <div class="text-center">
+ {{fa-icon "spinner" spin=true size="2"}}
+ </div>
+ {{/unless}}
+ </div>
+ <div class="modal-footer">
+ {{#unless hasError}}
+ <button type="button"
+ class="btn btn-default {{if isUpdating "disabled"}}" {{action 'close'}}>{{fa-icon icon="close"}}
+ Cancel
+ </button>
+ <button type="submit"
+ class="btn btn-primary {{if isUpdating "disabled"}}" {{action 'move'}}>{{fa-icon icon="share"}} Move
+ </button>
+
+ {{else}}
+ {{#unless shouldRetry}}
+ <button type="button" class="btn btn-default"
+ disabled={{isUpdating}} {{action "close"}}>{{fa-icon "remove"}} Cancel
+ </button>
+ {{/unless}}
+ <button type="button" class="btn btn-danger"
+ disabled={{isUpdating}} {{action "retryError"}}>{{fa-icon "refresh"}} Retry
+ </button>
+ {{#if shouldRetry}}
+ <button type="button" class="btn btn-danger"
+ disabled={{isUpdating}} {{action "skipAndRetry"}}>{{fa-icon "step-forward"}} Skip
+ </button>
+ <button type="button" class="btn btn-danger"
+ disabled={{isUpdating}} {{action "skipAll"}}>{{fa-icon "fast-forward"}} Skip All
+ </button>
+ {{/if}}
+ {{/unless}}
+ </div>
+ </div>
+ </div>
+ </div>
+{{/if}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/new-directory.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/new-directory.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/new-directory.hbs
new file mode 100644
index 0000000..bc21f31
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/new-directory.hbs
@@ -0,0 +1,48 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<button type="button" class="btn btn-sm btn-primary" id="myBtn" {{action "openModal"}} disabled={{currentPathIsTrash}}>{{fa-icon icon="folder-o"}} New Folder</button>
+
+{{#if modalGuard}}
+ <!-- Modal Dialog -->
+ <div class="modal fade" id="createDirectoryModal" role="dialog">
+ <div class="modal-dialog">
+ <!-- Modal content-->
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">×</button>
+ <h4 class="modal-title">{{fa-icon "folder-o"}} Add new folder</h4>
+ </div>
+ <form role="form">
+ <div class="modal-body">
+ <div class="form-group {{if hasError "has-error"}}">
+ <label>Name</label>
+ {{input type="text" class="form-control" placeholder="Enter folder name..." value=folderName}}
+ {{#if hasError}}<span class="help-block">{{errorMessage}}</span>{{/if}}
+ </div>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" {{action "close"}}>{{fa-icon "close"}} Cancel</button>
+ <button type="submit" class="btn btn-default btn-primary" {{action "create"}} >{{fa-icon "plus"}} Add</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+<!-- Modal Dialog Ends -->
+{{/if}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/open-preview-modal.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/open-preview-modal.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/open-preview-modal.hbs
new file mode 100644
index 0000000..98a5459
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/open-preview-modal.hbs
@@ -0,0 +1,38 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if modalGuard}}
+ <div class="modal fade" tabindex=-1 role="dialog">
+ <div class="modal-dialog modal-lg">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">×</button>
+ <h3 class="modal-title">File Preview</h3>
+ <div>{{ selectedFilePath }}</div>
+ </div>
+ <pre class="modal-body preview-content"
+ style="white-space:pre;margin: 10px; padding: 10px;overflow-y: auto; height: 350px">{{ filePreviewService.fileContent }}</pre>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" {{action 'close'}}>{{fa-icon icon="close"}} Cancel</button>
+ <button type="submit" class="btn btn-primary" {{action 'download'}}>{{fa-icon icon="download"}}Download
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+{{/if}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/permission-modal.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/permission-modal.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/permission-modal.hbs
new file mode 100644
index 0000000..e6dee66
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/permission-modal.hbs
@@ -0,0 +1,69 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if modalGuard}}
+ <div class="modal fade" tabindex=-1 role="dialog">
+ <div class="modal-dialog modal-sm">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">×</button>
+ <h4 class="modal-title">{{fa-icon icon="edit"}} Edit Permissions for {{#if selected.isDirectory}}folder{{else}}file{{/if}}</h4>
+ </div>
+ <form class="form-horizontal">
+ <div class="modal-body">
+
+ <div class="form-group">
+ <label class="col-sm-2 control-label">User</label>
+ <div class="btn-group col-md-10">
+ <button type="button" class="btn {{if usrR "btn-primary" "btn-default"}}" {{action "togglePermission" "usrR"}}>Read</button>
+ <button type="button" class="btn {{if usrW "btn-primary" "btn-default"}}" {{action "togglePermission" "usrW"}}>Write</button>
+ <button type="button" class="btn {{if usrE "btn-primary" "btn-default"}}" {{action "togglePermission" "usrE"}}>Execute</button>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="col-sm-2 control-label">Group</label>
+ <div class="btn-group col-md-10">
+ <button type="button" class="btn {{if grpR "btn-primary" "btn-default"}}" {{action "togglePermission" "grpR"}}>Read</button>
+ <button type="button" class="btn {{if grpW "btn-primary" "btn-default"}}" {{action "togglePermission" "grpW"}}>Write</button>
+ <button type="button" class="btn {{if grpE "btn-primary" "btn-default"}}" {{action "togglePermission" "grpE"}}>Execute</button>
+ </div>
+ </div>
+ <div class="form-group">
+ <label class="col-sm-2 control-label">Other</label>
+ <div class="btn-group col-md-10">
+ <button type="button" class="btn {{if othR "btn-primary" "btn-default"}}" {{action "togglePermission" "othR"}}>Read</button>
+ <button type="button" class="btn {{if othW "btn-primary" "btn-default"}}" {{action "togglePermission" "othW"}}>Write</button>
+ <button type="button" class="btn {{if othE "btn-primary" "btn-default"}}" {{action "togglePermission" "othE"}}>Execute</button>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <span class="spinner-wrap">
+ {{#if isUpdating}}
+ {{fa-icon "refresh" spin=true}}
+ {{/if}}
+ </span>
+ <button type="button" class="btn btn-default {{if isUpdating "disabled"}}" {{action 'close'}}>{{fa-icon icon="close"}} Cancel</button>
+ <button type="submit" class="btn btn-primary {{if isUpdating "disabled"}}" {{action 'chmod'}}>{{fa-icon icon="edit"}} Save</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+{{/if}}
\ No newline at end of file
[02/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/rename-modal.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/rename-modal.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/rename-modal.hbs
new file mode 100644
index 0000000..8b1fca7
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/rename-modal.hbs
@@ -0,0 +1,50 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#if modalGuard}}
+ <div class="modal fade" tabindex=-1 role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">×</button>
+ <h4 class="modal-title">{{fa-icon icon="edit"}} Rename {{#if selected.isDirectory}}Folder{{else}}File{{/if}}</h4>
+ </div>
+ <form>
+ <div class="modal-body">
+ <div class="form-group {{if hasError "has-error"}}">
+ <label>New name</label>
+ {{input class="form-control" placeholder="New name..." value=selectionName}}
+ {{#if hasError}}<span class="help-block">{{errorMessage}}</span>{{/if}}
+ </div>
+
+ </div>
+ <div class="modal-footer">
+ <span class="spinner-wrap">
+ {{#if isUpdating}}
+ {{fa-icon "refresh" spin=true}}
+ {{/if}}
+ </span>
+ <button type="button" class="btn btn-default {{if isUpdating "disabled"}}" {{action 'close'}}>{{fa-icon icon="close"}} Cancel</button>
+ <button type="submit" class="btn btn-primary {{if isUpdating "disabled"}}" {{action 'rename'}}>{{fa-icon icon="edit"}} Rename</button>
+ </div>
+ </form>
+
+ </div>
+ </div>
+ </div>
+{{/if}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/renameInput.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/renameInput.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/renameInput.hbs
deleted file mode 100644
index 57a7b7c..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/components/renameInput.hbs
+++ /dev/null
@@ -1,38 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-{{#if isRenaming}}
-
-<div class="input-group input-group-sm rename-area">
- {{view view.renameInputView class="form-control rename-input" valueBinding='tmpName'}}
- <div class="input-group-btn">
- <button type="button" {{action 'rename' 'cancel'}} {{bind-attr class=":btn :btn-danger :btn-xs :btn-rename-cancel isRenaming:show"}} >
- <i class="fa fa-times"></i> Cancel
- </button>
- </div>
- <div class="input-group-btn">
- <button type="button" {{action 'rename' 'confirm'}} {{bind-attr class=":btn :btn-success :btn-xs :btn-rename isRenaming:show"}} >
- <i class="fa fa-check"></i> Rename
- </button>
- </div>
-</div>
-
-{{else}}
-
- {{yield}}
-
-{{/if}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/upload-file.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/upload-file.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/upload-file.hbs
new file mode 100644
index 0000000..c1352dd
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/components/upload-file.hbs
@@ -0,0 +1,56 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<button type="button" class="btn btn-sm btn-primary" {{action "openModal"}} disabled={{currentPathIsTrash}}>{{fa-icon icon="upload"}} Upload</button>
+
+{{#if modalGuard}}
+ <!-- Modal Dialog -->
+ <div class="modal fade" role="dialog">
+ <div class="modal-dialog">
+ <!-- Modal content-->
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">×</button>
+ <h4>{{fa-icon "upload"}} Upload file to {{path}}</h4>
+ </div>
+ <div class="modal-body">
+ {{#unless isUploading}}
+ {{#file-picker fileLoaded="fileLoaded" preview=false}}
+ <div class="text-center vert-align-middle">
+ {{fa-icon "cloud-upload" size="4"}}
+ <h4> Drag file to upload or click to browse</h4>
+ </div>
+ {{/file-picker}}
+ {{else}}
+ <div class="progress file-picker-progress">
+ <div class="progress-bar" role="progressbar" aria-valuenow="{{uploadPercent}}" aria-valuemin="0"
+ aria-valuemax="100" style={{uploadPercentStyle}}>
+ {{uploadPercent}}
+ </div>
+ </div>
+ <em>{{uploadFileName}}</em>
+ {{/unless}}
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" {{action 'close'}}>{{fa-icon icon="close"}} Cancel</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- Modal Dialog Ends -->
+{{/if}}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/components/uploader.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/components/uploader.hbs b/contrib/views/files/src/main/resources/ui/app/templates/components/uploader.hbs
deleted file mode 100644
index cefc9f8..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/components/uploader.hbs
+++ /dev/null
@@ -1,35 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-<div class="input-group input-group-sm">
- <span class="input-group-btn">
- <span class="btn btn-primary btn-file">
- Browse… {{view fileInput}}
- </span>
- <span {{bind-attr class=":btn :btn-danger isFiles:hide"}} {{action 'clear'}} >
- Clear
- </span>
- </span>
- <span {{bind-attr class=":input-group-btn :btn-upload isFiles:hide"}}>
- {{#view uploadButton data-style="expand-right" data-size="xs"}}
- <span class="ladda-label">Upload</span>
- {{/view}}
- </span>
- {{view controlInput placeholder='Select files to upload.'}}
-</div>
-
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/error.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/error.hbs b/contrib/views/files/src/main/resources/ui/app/templates/error.hbs
deleted file mode 100644
index 202bb22..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/error.hbs
+++ /dev/null
@@ -1,32 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-<div class="container">
- <div class="alert alert-danger collapse-group">
- <strong>{{content.status}}</strong> {{publicMessage}}
- </div>
- {{#if stackTrace}}
- <a href="#" {{action "toggleStackTrace" post}}>
- <i {{bind-attr class=":fa isExpanded:fa-toggle-down:fa-toggle-right"}}></i>
- {{#if isExpanded}} Collapse Stack Trace {{else}} Expand Stack Trace {{/if}}
- </a>
- {{#if isExpanded}}
- <pre class="prettyprint">{{stackTrace}}</pre>
- {{/if}}
- {{/if}}
-</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/files.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/files.hbs b/contrib/views/files/src/main/resources/ui/app/templates/files.hbs
index 6d0f25b..769f0c8 100644
--- a/contrib/views/files/src/main/resources/ui/app/templates/files.hbs
+++ b/contrib/views/files/src/main/resources/ui/app/templates/files.hbs
@@ -1,211 +1,102 @@
{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
}}
-<div class="panel-default panel-files">
- <div class="panel-heading">
- {{!-- BREADCRUMBS --}}
- {{bread-crumbs path=path}}
-
- <div class="um-section">
- {{!-- UPLOADER --}}
- <div {{bind-attr class="isUploading::hide :pull-right" }}>
- <button {{action 'upload' 'close'}} type="button" class="close" aria-hidden="true">×</button>
- {{file-uploader path=path uploader=uploader store=controller.store dirStatus=content.meta class="upload-area pull-right" alert='showAlert'}}
+<div class="row" >
+ <div class="col-md-12 col-xs-12 text-center context-text-row">
+ {{#if isSelected}}
+ <span class="context-text">
+ {{#if isSingleSelected}}
+ <strong>{{lastSelectedFile.name}}</strong> selected
+ {{else}}
+ <strong>{{selectedFilesCount}}</strong> Files, <strong>{{selectedFolderCount}}</strong> Folders selected
+ {{/if}}
+ </span>
+ {{else}}
+ <span class="context-text" style=" z-index: 1;
+ position: relative;">
+ Total: <strong>{{arrangedContent.length}}</strong> files or folders
+ </span>
+ {{/if}}
</div>
-
- <div {{bind-attr class="isUploading:hide: :pull-right :uploadwrap" }}>
- <button type="button" {{action 'upload' 'open'}} {{bind-attr class=":btn :btn-default :btn-sm :pull-right"}}>
- <i class="fa fa-upload"></i> Upload
- </button>
+</div>
+<div class="row">
+ <div class="col-md-6 col-xs-6">
+ {{#if hasHomePath}}
+ {{#link-to 'files' (query-params path=homePath) class="btn btn-sm btn-default"}}{{fa-icon "home"}}{{/link-to}}
+ {{/if}}
+ {{#if hasTrashPath}}
+ {{#link-to 'files' (query-params path=trashPath) class="btn btn-sm btn-default"}}{{fa-icon "trash"}}{{/link-to}}
+ {{/if}}
+ <a href="#" {{action 'refreshCurrentRoute'}} class="btn btn-sm btn-default">{{fa-icon "refresh"}}</a>
+ {{files-breadcrumb path=path}}
</div>
-
- {{!-- MKDIR --}}
- {{mkdir-input create="mkdir" path=path canCreate=true}}
-
+ <!-- Include directory name and rename button -->
+ <div class="col-md-6 col-xs-6">
+ <p class="pull-right">
+ <button class="btn btn-sm btn-primary" {{action "selectAll" allSelected}}>
+ {{#unless allSelected}}
+ {{fa-icon icon="plus" }} Select All
+ {{else}}
+ {{fa-icon icon="minus"}} Deselect All
+ {{/unless}}
+ </button>
+ {{new-directory path=path refreshAction="refreshCurrentRoute" currentPathIsTrash=currentPathIsTrash}}
+ {{upload-file path=path refreshAction="refreshCurrentRoute" currentPathIsTrash=currentPathIsTrash}}
+ {{#link-to 'messages' class="btn btn-sm btn-default"}}{{fa-icon "comment-o"}}{{/link-to}}
+ </p>
</div>
- </div>
-
- <div class="panel-body">
- <h4 class="i-am-in pull-left"> <i class="fa fa-folder fa-lg"></i>
- {{#rename-input file=path confirm='renameDir' isRenaming=isRenaming class='renameable stocked half'}}
- <a href="#" class="dir-name" {{action 'refreshDir'}}>{{currentDir}}</a>
- <a href="#" {{bind-attr class="isRootDir:hide"}} {{action 'showRenameInput'}}><i class="fa fa-edit"></i></a>
- {{/rename-input}}
- </h4>
+</div>
- <div class="input-group input-group-sm input-group-search">
- {{input valueBinding='searchString' class="form-control input-search" placeholder="Search File Names" }}
- {{#if searchString}}
- <i {{action 'clearSearchField'}} class="fa fa-times form-control-feedback"></i>
- {{/if}}
- <div class="input-group-addon"><i class="fa fa-search"></i></div>
+<div class="row">
+ <div class="well well-sm col-md-12 col-xs-12">
+ <div class="col-md-8 col-xs-8">
+ {{context-row-menu
+ openFolderAction="openFolder"
+ refreshCurrentRouteAction="refreshCurrentRoute"
+ currentPathIsTrash=currentPathIsTrash
+ hasTrashPath=hasTrashPath
+ }}
+ </div>
+ <div class="col-md-4 col-xs-4">
+ <div class="row">
+ {{file-search searchText=searchText searchAction="searchFiles"}}
+ </div>
+ </div>
</div>
- </div>
-
- <table class="table table-hover table-files">
- <thead>
- <tr>
- <th class="icon"></th>
- <th class="path" {{action 'sort' 'name'}}> Name {{sort-arrow sPs=sortProperties sA=sortAscending sP='name'}} </th>
- <th class="size" {{action 'sort' 'size'}}>Size {{sort-arrow sPs=sortProperties sA=sortAscending sP='size'}}</th>
- <th class="date" {{action 'sort' 'date'}}>Last Modified {{sort-arrow sPs=sortProperties sA=sortAscending sP='date'}}</th>
- <th class="owner" {{action 'sort' 'owner'}}>Owner {{sort-arrow sPs=sortProperties sA=sortAscending sP='owner'}}</th>
- <th class="grp" {{action 'sort' 'group'}} >Group {{sort-arrow sPs=sortProperties sA=sortAscending sP='group'}}</th>
- <th class="perm" {{action 'sort' 'permission'}} >Permission {{sort-arrow sPs=sortProperties sA=sortAscending sP='permission'}}</th>
- <th class="download">
- <div class="btn-group btn-sort pull-right" data-toggle="tooltip" data-placement="left" title="Sort by:">
- <button type="button" class="btn btn-xs btn-default" {{action 'sort' 'toggle'}}>
- {{#if sortAscending}} Asc {{else}} Desc {{/if}}
- </button>
+</div>
- <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
- <span>
- {{#if isSortPropertyEqualsDate}}
- Last Modified
- {{else}}
- {{capitalize sortProperties.firstObject}}
- {{/if}}
- </span>
- <span class="caret"></span>
- </button>
- <ul class="dropdown-menu" role="menu">
- <li><a href="#" {{action 'sort' 'name'}} >Name</a></li>
- <li><a href="#" {{action 'sort' 'size'}} >Size</a></li>
- <li><a href="#" {{action 'sort' 'date'}} >Last Modified</a></li>
- <li><a href="#" {{action 'sort' 'owner'}} >Owner</a></li>
- <li><a href="#" {{action 'sort' 'group'}} >Group</a></li>
- <li><a href="#" {{action 'sort' 'permission'}} >Permission</a></li>
- </ul>
- </div>
- </th>
- <th class="check">
- {{#dropdown-wrap}}
- <div id="bulkDropdown" class="btn-group">
- <span class="input-group-addon">
- <div class="checkbox">
- {{bulk-checkbox content=fileList}}
- </div>
- </span>
- <button type="button" data-toggle="dropdown" {{bind-attr class=":btn :btn-xs :btn-default :dropdown-toggle isSelected::disabled"}} >
- <span class="caret"></span>
- </button>
- <ul class="dropdown-menu pull-right" role="menu">
- <li><a href="#" {{action 'download' 'zip'}} ><i class="fa fa-archive fa-fw"></i> Download zip</a></li>
- {{#if canConcat}}
- <li><a href="#" {{action 'download' 'concat'}} ><i class="fa fa-th fa-fw"></i> Concat</a></li>
- {{/if}}
- <li class="divider"></li>
- <li class="dropdown-submenu">
- <a href="#" disabled="disabled">
- <i class="fa fa-chevron-left fa-gr fa-fw"></i> Delete
- </a>
- <ul class="dropdown-menu left-submenu">
- {{confirm-delete confirm="deleteFile" deleteForever=true selector='bulkDropdown' access=true}}
- {{confirm-delete confirm="deleteFile" deleteForever=false selector='bulkDropdown' access=true}}
- </ul>
- </li>
- </ul>
- </div>
- {{/dropdown-wrap}}
- </th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><i class="fa fa-folder"></i></td>
- <td {{action 'dirUp'}} colspan="7">
- <strong> .. </strong>
- </td>
- </tr>
- <tr class="error-row">
- <td colspan="8" class="danger">
- {{outlet error}}
- </td>
- </tr>
- {{#unless hideMoving}}
- {{#if movingFile}}
- <tr class="isMoving">
- <td>
- {{#if movingFile.isDirectory}}
- <i class="fa fa-folder"></i>
- {{else}}
- <i class="fa fa-file"></i>
- {{/if}}
- </td>
- <td>
- <div class="file-name">
- <span>
- <a>
- {{movingFile.name}}
- </a>
- </span>
- <span class="help-block mod-time">
- <small>
- Updated {{showDateUnix movingFile.modificationTime 'YYYY-MM-DD HH:mm'}}
- </small>
- </span>
- </div>
- </td>
- <td>
- {{#unless content.isDirectory}}
- {{humanSize movingFile.len}}
- {{/unless}}
- </td>
- <td >{{movingFile.owner}}</td>
- <td>{{movingFile.group}}</td>
- <td>{{movingFile.permission}}</td>
- <td >
- <ul class="list-inline file-actions text-right">
- <li>
- <a href="#" {{action 'moveFile' 'move'}} data-toggle="tooltip" data-placement="bottom" title="Paste"><i class="fa fa-clipboard fa-lg"></i></a>
- </li>
- </ul>
- </td>
- <td >
- <a href="#" {{action 'moveFile' 'cancel' }} data-toggle="tooltip" data-placement="bottom" title="Cancel moving"> <i class="fa fa-times fa-lg"></i> </a>
- </td>
- </tr>
- {{/if}}
- {{/unless}}
- </tbody>
- {{#unless isLoadingFiles}}
- {{cloaked-collection
- cloakView="file"
- content=fileList
- itemController="file"
- loadingHTML='<td colspan="8" class="text-center"><i class="fa fa-refresh"></i></td>'
- tagName='tbody'
- defaultHeight='47'}}
- {{else}}
- <tbody>
- <td colspan="8" class="text-center"><i class="fa fa-refresh fa-spin"></i></td>
- </tbody>
- {{/unless}}
- <tbody>
- {{#unless fileList}}
- <tr {{bind-attr class="isLoadingFiles:hide"}} >
- <td colspan="8">
- No files
- </td>
- </tr>
- {{/unless}}
- </tbody>
- </table>
- {{context-menu target=targetContextMenu}}
- {{outlet modal}}
+<div class="row">
+ <div class="col-md-12 col-xs-12" id="filesCollectionView">
+ {{#files-collection items=arrangedContent
+ columnsConfig=columns
+ sortEnabled=sortEnabled
+ parentPath=parentPath
+ sortAction="sortFiles"
+ resetSelection="deselectAll"
+ selectAllAction="selectAll"
+ containerId="filesCollectionView" as |file index|}}
+ {{file-row index=index
+ file=file
+ columnHeaders=columns
+ singleSelectAction="selectSingle"
+ multiSelectAction="selectMultiple"}}
+ {{/files-collection}}
+ </div>
</div>
+
+{{outlet}}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/index.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/index.hbs b/contrib/views/files/src/main/resources/ui/app/templates/index.hbs
deleted file mode 100644
index 0efb5b2..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/index.hbs
+++ /dev/null
@@ -1,18 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/loading.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/loading.hbs b/contrib/views/files/src/main/resources/ui/app/templates/loading.hbs
new file mode 100644
index 0000000..0c27eef
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/loading.hbs
@@ -0,0 +1,25 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<div class="row text-center loading-spinner">
+ {{fa-icon "spinner" spin=true size=2}}
+ {{fa-icon "spinner" spin=true size=3}}
+ {{fa-icon "spinner" spin=true size=5}}
+ {{fa-icon "spinner" spin=true size=3}}
+ {{fa-icon "spinner" spin=true size=2}}
+</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/messages.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/messages.hbs b/contrib/views/files/src/main/resources/ui/app/templates/messages.hbs
new file mode 100644
index 0000000..8b6c685
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/messages.hbs
@@ -0,0 +1,54 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<div class="row">
+ <div class="col-md-12 messages-header">
+ <div class="col-md-1">
+ {{#link-to "files" (query-params path=currentBrowserPath) class="btn btn-primary"}}{{fa-icon "arrow-left"}} Browser{{/link-to}}
+ </div>
+ <div class="col-md-2 col-md-offset-4 text-center">
+ <span class="messages-title">{{fa-icon "comment"}} Messages</span>
+ </div>
+ </div>
+</div>
+<div class="row">
+ <div class={{if isExpanded "col-md-12" "col-md-4"}}>
+ <div class="list-group">
+ {{#each model as |message|}}
+ {{#link-to 'messages.message' message class=(alert-message-context-class message.type "list-group-item list-group-item-")}}
+ <h4 class="list-group-item-heading">
+ {{#fa-stack}}
+ {{fa-icon "circle-thin" stack=2}}
+ {{fa-icon (alert-message-icon-class message.type) stack=1}}
+ {{/fa-stack}}
+ {{{message.message}}}</h4>
+ <p class="list-group-item-text">{{shorten-text message.responseMessage shortenLength}}</p>
+ {{/link-to}}
+ {{else}}
+ No messages present
+ {{/each}}
+ </div>
+
+ </div>
+ {{#unless isExpanded}}
+ <div class="col-md-8">
+ {{outlet}}
+ </div>
+ {{/unless}}
+</div>
+
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/messages/message.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/messages/message.hbs b/contrib/views/files/src/main/resources/ui/app/templates/messages/message.hbs
new file mode 100644
index 0000000..e3eacec
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/templates/messages/message.hbs
@@ -0,0 +1,48 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+<div class={{alert-message-context-class model.type "panel panel-"}}>
+ <div class="panel-heading">
+ {{#fa-stack size="lg"}}
+ {{fa-icon "circle-thin" stack=2}}
+ {{fa-icon (alert-message-icon-class model.type) stack=1}}
+ {{/fa-stack}}
+ {{{model.message}}}
+ </div>
+ {{#if displayBody}}
+ <div class="panel-body">
+ {{#if showStatus}}
+ <p><strong>Server status:</strong> {{model.status}}</p>
+ <hr/>
+ {{/if}}
+ {{#if model.responseMessage}}
+ {{alert-message-display title="Server Message:"
+ value=model.responseMessage
+ shorten=true
+ length=200}}
+ <hr/>
+ {{/if}}
+ {{#if model.trace}}
+ {{alert-message-display title="Error trace:"
+ value=model.trace
+ shorten=true
+ length=500}}
+ {{/if}}
+ </div>
+ {{/if}}
+</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/modal/chmod.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/modal/chmod.hbs b/contrib/views/files/src/main/resources/ui/app/templates/modal/chmod.hbs
deleted file mode 100644
index 5ef620c..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/modal/chmod.hbs
+++ /dev/null
@@ -1,97 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-
-<div class="modal chmodal" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static">
- <div class="modal-dialog modal-sm">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
- <h4 class="modal-title">Edit permission</h4>
- </div>
- <div class="modal-body">
-
- <form class="form-horizontal" role="form">
- <div class="form-group">
- <label class="col-sm-2 control-label">User</label>
- <div class="col-sm-10">
- <div class="btn-group" data-toggle="buttons">
- <label {{bind-attr class=":btn :btn-sm usrR:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=usrR}} <span>Read</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm usrW:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=usrW}} <span>Write</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm usrE:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=usrE}} <span>Execute</span>
- </label>
- </div>
- </div>
- </div>
- <div class="form-group">
- <label class="col-sm-2 control-label">Group</label>
- <div class="col-sm-10">
- <div class="btn-group" data-toggle="buttons">
- <label {{bind-attr class=":btn :btn-sm grpR:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=grpR}} <span>Read</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm grpW:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=grpW}} <span>Write</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm grpE:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=grpE}} <span>Execute</span>
- </label>
- </div>
- </div>
- </div>
- <div class="form-group">
- <label class="col-sm-2 control-label">Other</label>
- <div class="col-sm-10">
- <div class="btn-group" data-toggle="buttons">
- <label {{bind-attr class=":btn :btn-sm otrR:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=otrR}} <span>Read</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm otrW:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=otrW}} <span>Write</span>
- </label>
- <label {{bind-attr class=":btn :btn-sm otrE:btn-primary:btn-default :btn-chmod" }} >
- {{input type="checkbox" checked=otrE}} <span>Execute</span>
- </label>
- </div>
- </div>
- </div>
-
- <div class="form-group">
- <div class="col-sm-offset-2 col-sm-10">
- <div class="checkbox">
- <label>
- {{input type="checkbox"}} <span> Modify recursively</span>
- </label>
- </div>
- </div>
- </div>
- </form>
-
- </div>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" {{action 'close' target="view"}}>Close</button>
- <button type="button" class="btn btn-primary" {{action 'confirm' target="view"}}>Save changes</button>
- </div>
- </div>
- </div>
-</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/modal/preview.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/modal/preview.hbs b/contrib/views/files/src/main/resources/ui/app/templates/modal/preview.hbs
deleted file mode 100644
index d619bd9..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/modal/preview.hbs
+++ /dev/null
@@ -1,33 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-<div class="modal preview" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static">
- <div class="modal-dialog modal-lg">
- <div class="modal-content">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
- <h4 class="modal-title">File Preview</h4>
- {{ file.path }}
- </div>
- <pre class="modal-body preview-content" style="white-space:pre;margin: 10px; padding: 10px;overflow-y: auto; height: 350px">{{ pagecontent }}</pre>
- <div class="modal-footer">
- <button type="button" class="btn btn-default" {{action 'close' target="view"}}>Close</button>
- <button type="button" class="btn btn-primary" {{action 'confirm' target="view"}}>Download File</button>
- </div>
- </div>
- </div>
-</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/util/errorRow.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/util/errorRow.hbs b/contrib/views/files/src/main/resources/ui/app/templates/util/errorRow.hbs
deleted file mode 100644
index 5f0a03a..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/util/errorRow.hbs
+++ /dev/null
@@ -1,32 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
-<div>
- <button {{action 'removeAlert'}} type="button" class="close" aria-hidden="true">×</button>
- <div class="text-center"><strong>{{content.status}} </strong> {{output}}
- {{#if stackTrace}}
- <a href="#" {{action "toggleStackTrace" post}}>
- <i {{bind-attr class=":fa isExpanded:fa-toggle-down:fa-toggle-right"}}></i>
- {{#if isExpanded}} Collapse Stack Trace {{else}} Expand Stack Trace {{/if}}
- </a>
- {{#if isExpanded}}
- <pre class="prettyprint">{{stackTrace}}</pre>
- {{/if}}
- {{/if}}
- </div>
-</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/templates/util/fileRow.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/templates/util/fileRow.hbs b/contrib/views/files/src/main/resources/ui/app/templates/util/fileRow.hbs
deleted file mode 100644
index 8cd0cbb..0000000
--- a/contrib/views/files/src/main/resources/ui/app/templates/util/fileRow.hbs
+++ /dev/null
@@ -1,79 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
- <td>
- {{#if content.isDirectory}}
- <i class="fa fa-folder"></i>
- {{else}}
- <i class="fa fa-file"></i>
- {{/if}}
- </td>
- <td>
- {{#rename-input fileBinding='content' confirm='rename' isRenaming=isRenaming}}
- <div class="file-name allow-open">
- {{#file-shaker action="open" isValid=true}}
- <span>
- <a>
- <strong>
- {{content.name}}
- </strong>
- </a>
- </span>
- {{/file-shaker}}
- </div>
- {{/rename-input}}
- </td>
- <td>
- {{#unless content.isDirectory}}{{humanSize content.size}}{{else}}-{{/unless}}
- </td>
- <td>
- <small class='allow-open'>
- {{showDate modificationTime 'YYYY-MM-DD HH:mm'}}
- </small>
- </td>
- <td >{{content.owner}}</td>
- <td>{{content.group}}</td>
- <td class="permission-cell">
- {{content.permission}}
- {{#if isPermissionsDirty}} <span>*</span> {{/if}}
- </td>
- <td>
- {{#unless isMoving}}
- <ul class="list-inline file-actions text-right">
- <li>
- {{#if content.isDirectory}}
- <a href="#" {{action 'download' 'zip'}} target="_blank" data-toggle="tooltip" data-placement="bottom" title="Download zip"><i class="fa fa-archive fa-fw fa-lg"></i></a>
- {{else}}
- <a href="#" {{action 'download' 'browse'}} target="_blank" data-toggle="tooltip" data-placement="bottom" title="Download"><i class="fa fa-download fa-fw fa-lg"></i></a>
- {{/if}}
- </li>
- <li>
- <a href="#" {{action 'moveFile' 'cut' this.content}} data-toggle="tooltip" data-placement="bottom" title="Move"><i class="fa fa-level-down fa-rotate-270 fa-fw fa-lg"></i></a>
- </li>
- <li>{{popover-delete confirm="deleteFile"}}</li>
- </ul>
- {{/unless}}
- </td>
- <td>
- {{#if isMoving}}
- <a href="#" {{action 'moveFile' 'cancel' target="parentController" }} data-toggle="tooltip" data-placement="bottom" title="Cancel moving"> <i class="fa fa-times fa-lg"></i></a>
- {{else}}
- {{input type="checkbox" checkedBinding='content.selected'}}
- {{/if}}
- {{toggle-context}}
- </td>
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/transforms/iso-date.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/transforms/iso-date.js b/contrib/views/files/src/main/resources/ui/app/transforms/iso-date.js
new file mode 100644
index 0000000..510bc30
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/transforms/iso-date.js
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import DS from 'ember-data';
+
+export default DS.Transform.extend({
+ deserialize(serialized) {
+ if (serialized) {
+ return moment.utc(serialized).toDate();
+ }
+ return serialized;
+ },
+
+ serialize(deserialized) {
+ if (deserialized) {
+ return moment(deserialized).format('X');
+ }
+ return deserialized;
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/utils/file-uploader.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/utils/file-uploader.js b/contrib/views/files/src/main/resources/ui/app/utils/file-uploader.js
new file mode 100644
index 0000000..8a7f972
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/app/utils/file-uploader.js
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import EmberUploader from 'ember-uploader';
+
+export default EmberUploader.Uploader.extend({
+ type: 'PUT',
+ ajaxSettings: function(url, params, method) {
+ var defaultSettings = this._super(url, params, method);
+ return Ember.merge(defaultSettings, {
+ beforeSend:function (xhr) {
+ xhr.setRequestHeader('X-Requested-By', 'ambari');
+ }
+ });
+ }
+});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/views/file.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/views/file.js b/contrib/views/files/src/main/resources/ui/app/views/file.js
deleted file mode 100644
index c0404a8..0000000
--- a/contrib/views/files/src/main/resources/ui/app/views/file.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-Em.CloakedView.reopen({
- classNames:['file-row'],
- classNameBindings:['_containedView.controller.isMoving:isMoving']
-});
-
-Ember.CloakedView.reopen({
- cloak:Em.K
-});
-
-App.FileView = Em.View.extend({
- templateName: 'util/fileRow',
- tagName:'tr'
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/views/files.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/views/files.js b/contrib/views/files/src/main/resources/ui/app/views/files.js
deleted file mode 100644
index 1db7f61..0000000
--- a/contrib/views/files/src/main/resources/ui/app/views/files.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.FilesView = Em.View.extend({
- templateName: 'files',
- didInsertElement:function () {
- this.scheduleRebind();
- },
- scheduleRebind:function () {
- Em.run.scheduleOnce('render', this, this.get('reBindTooltips'));
- },
- reBindTooltips:function () {
- this.$().tooltip({selector:'[data-toggle=tooltip]'});
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/views/filesAlert.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/views/filesAlert.js b/contrib/views/files/src/main/resources/ui/app/views/filesAlert.js
deleted file mode 100644
index 68dc60a..0000000
--- a/contrib/views/files/src/main/resources/ui/app/views/filesAlert.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.FilesAlertView = Em.View.extend({
- templateName:'util/errorRow'
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/views/modalChmod.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/views/modalChmod.js b/contrib/views/files/src/main/resources/ui/app/views/modalChmod.js
deleted file mode 100644
index 5696539..0000000
--- a/contrib/views/files/src/main/resources/ui/app/views/modalChmod.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.ModalChmodView = Em.View.extend({
- actions:{
- confirm:function (file) {
- this.get('controller.controllers.files').send('confirmChmod',this.get('controller.file'));
- this.$('.chmodal').modal('hide');
- },
- close:function () {
- var file = this.get('controller.file');
- var diff = file.changedAttributes();
- if (diff.permission) {
- file.set('permission',diff.permission[0]);
- }
- this.$('.chmodal').modal('hide');
- }
- },
- didInsertElement:function (argument) {
- this.$('.btn-chmod').each(function () {
- $(this).toggleClass('active',$(this).children('input').is(':checked'));
- });
-
- this.$('.chmodal').modal();
- this.$('.chmodal').on('hidden.bs.modal',function () {
- this.get('controller.controllers.files').send('removeChmodModal');
- }.bind(this));
- },
- willClearRender:function () {
- this.$('.chmodal').off('hidden.bs.modal');
- this.$('.chmodal').modal('hide');
- }
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/views/modalPreview.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/views/modalPreview.js b/contrib/views/files/src/main/resources/ui/app/views/modalPreview.js
deleted file mode 100644
index 49d7fce..0000000
--- a/contrib/views/files/src/main/resources/ui/app/views/modalPreview.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.ModalPreviewView = Em.View.extend({
- actions:{
- confirm:function (file) {
- this.get('controller.controllers.file').send('confirmPreview', this.get('controller.file'));
- this.$('.preview').modal('hide');
- },
- close:function () {
- this.$('.preview').modal('hide');
- }
- },
- didInsertElement:function (argument) {
- var self = this;
-
- this.$('.preview').modal();
-
- this.$('.preview').on('hidden.bs.modal',function () {
- this.get('controller.controllers.files').send('removePreviewModal');
- }.bind(this));
-
- this.$('.preview-content').on('scroll', function() {
- if($(this).scrollTop() + $(this).innerHeight() >= this.scrollHeight) {
- self.get('controller').send('next');
- }
- });
-
- },
- willClearRender:function () {
- this.$('.preview').off('hidden.bs.modal');
- this.$('.preview').modal('hide');
- }
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/bower.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/bower.json b/contrib/views/files/src/main/resources/ui/bower.json
index c0a4049..7212b31 100644
--- a/contrib/views/files/src/main/resources/ui/bower.json
+++ b/contrib/views/files/src/main/resources/ui/bower.json
@@ -1,32 +1,21 @@
{
- "name": "filebrowser-web",
- "version": "0.0.1",
- "main": "public/app.js",
+ "name": "files-view",
"dependencies": {
- "ember": "1.7.0",
- "ember-data": "1.0.0-beta.9",
- "jquery": "2.x",
- "bootstrap": "3.1.x",
- "ember-uploader": "~0.2.7",
- "ladda-bootstrap": "git://github.com/msurguy/ladda-bootstrap.git#~0.1.0",
- "moment": "~2.5.1",
- "ember-i18n": "~1.6.0",
- "bootstrap-contextmenu": "~0.2.0",
- "font-awesome": "~4.0.3",
- "ivy-codemirror": "~1.0.0"
+ "ember": "2.2.0",
+ "ember-cli-shims": "0.1.0",
+ "ember-cli-test-loader": "0.2.2",
+ "ember-load-initializers": "0.1.7",
+ "ember-qunit-notifications": "0.1.0",
+ "jquery": "1.11.3",
+ "loader.js": "^3.5.0",
+ "qunit": "~1.20.0",
+ "bootstrap": "~3.3.6",
+ "bootstrap-treeview": "~1.2.0",
+ "moment": "~2.11.1",
+ "font-awesome": "~4.5.0",
+ "ember-uploader": "~0.3.11"
},
- "overrides": {
- "ember-uploader": {
- "main": "dist/ember-uploader.js"
- },
- "cldr": {
- "main": "plurals.js"
- },
- "ember-i18n": {
- "scripts": []
- },
- "font-awesome": {
- "main": "css/font-awesome.css"
- }
+ "resolutions": {
+ "ember": "2.2.0"
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/config.coffee
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/config.coffee b/contrib/views/files/src/main/resources/ui/config.coffee
deleted file mode 100644
index 3dfa8f9..0000000
--- a/contrib/views/files/src/main/resources/ui/config.coffee
+++ /dev/null
@@ -1,53 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-exports.config =
-
- watcher:
- usePolling: true
-
- fileListInterval: 512
-
- files:
- javascripts:
- defaultExtension: 'js'
- joinTo:
- 'javascripts/app.js': /^app/
- 'javascripts/vendor.js': /^bower_components|vendor/,
- 'javascripts/test.js': /^test(\/|\\)(?!vendor)/
-
- stylesheets:
- defaultExtension: 'css'
- joinTo: 'stylesheets/app.css'
-
- templates:
- precompile: true
- root: 'templates'
- defaultExtension: 'hbs'
- joinTo: 'javascripts/app.js' : /^app/
- paths:
- jquery: 'bower_components/jquery/dist/jquery.js'
- handlebars: 'bower_components/handlebars/handlebars.js'
- ember: 'bower_components/ember/ember.js'
-
- modules:
- addSourceURLs: true
-
- overrides:
- development:
- paths:
- public: '/usr/lib/ambari-server/web/views-debug/FILES/1.0.0/MyFiles/'
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/config/environment.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/config/environment.js b/contrib/views/files/src/main/resources/ui/config/environment.js
new file mode 100644
index 0000000..9f29122
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/config/environment.js
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* jshint node: true */
+
+module.exports = function(environment) {
+ var ENV = {
+ modulePrefix: 'files-view',
+ environment: environment,
+ baseURL: '/',
+ locationType: 'hash',
+ EmberENV: {
+ FEATURES: {
+ // Here you can enable experimental features on an ember canary build
+ // e.g. 'with-controller': true
+ }
+ },
+
+ APP: {
+ // Here you can pass flags/options to your application instance
+ // when it is created
+ },
+
+ flashMessageDefaults: {
+ injectionFactories: []
+ }
+ };
+
+ if (environment === 'development') {
+ // ENV.APP.LOG_RESOLVER = true;
+ // ENV.APP.LOG_ACTIVE_GENERATION = true;
+ // ENV.APP.LOG_TRANSITIONS = true;
+ // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
+ // ENV.APP.LOG_VIEW_LOOKUPS = true;
+ }
+
+ if (environment === 'test') {
+ // Testem prefers this...
+ ENV.baseURL = '/';
+ ENV.locationType = 'none';
+
+ // keep test console output quieter
+ ENV.APP.LOG_ACTIVE_GENERATION = false;
+ ENV.APP.LOG_VIEW_LOOKUPS = false;
+
+ ENV.APP.rootElement = '#ember-testing';
+ }
+
+ if (environment === 'production') {
+
+ }
+
+ return ENV;
+};
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/ember-cli-build.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/ember-cli-build.js b/contrib/views/files/src/main/resources/ui/ember-cli-build.js
new file mode 100644
index 0000000..ab684c4
--- /dev/null
+++ b/contrib/views/files/src/main/resources/ui/ember-cli-build.js
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*jshint node:true*/
+/* global require, module */
+var EmberApp = require('ember-cli/lib/broccoli/ember-app');
+
+module.exports = function(defaults) {
+ var app = new EmberApp(defaults, {
+ // Add options here
+ lessOptions: {
+ paths: [
+ 'bower_components/bootstrap/less'
+ ]
+ }
+ });
+
+ // Use `app.import` to add additional libraries to the generated
+ // output files.
+ //
+ // If you need to use different assets in different
+ // environments, specify an object as the first parameter. That
+ // object's keys should be the environment name and the values
+ // should be the asset to use in that environment.
+ //
+ // If the library that you are including contains AMD or ES6
+ // modules that you would like to import into your application
+ // please specify an object with the list of modules as keys
+ // along with the exports of each module as its value.
+
+ app.import(app.bowerDirectory + '/bootstrap/dist/js/bootstrap.js');
+ app.import(app.bowerDirectory + '/bootstrap-treeview/src/js/bootstrap-treeview.js');
+ app.import(app.bowerDirectory + '/bootstrap-treeview/dist/bootstrap-treeview.min.css');
+
+ /*
+ app.import(app.bowerDirectory + '/bootstrap/fonts/glyphicons-halflings-regular.eot', {
+ destDir: 'fonts'
+ });
+ app.import(app.bowerDirectory + '/bootstrap/fonts/glyphicons-halflings-regular.svg', {
+ destDir: 'fonts'
+ });
+ app.import(app.bowerDirectory + '/bootstrap/fonts/glyphicons-halflings-regular.ttf', {
+ destDir: 'fonts'
+ });
+ app.import(app.bowerDirectory + '/bootstrap/fonts/glyphicons-halflings-regular.woff', {
+ destDir: 'fonts'
+ });*/
+
+ app.import('bower_components/moment/moment.js');
+ app.import('bower_components/ember-uploader/dist/ember-uploader.named-amd.js');
+
+ return app.toTree();
+};
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/collection/collection.js.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/collection/collection.js.hbs b/contrib/views/files/src/main/resources/ui/generators/collection/collection.js.hbs
deleted file mode 100644
index 04a95a9..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/collection/collection.js.hbs
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.{{#camelize}}{{pluralName}}{{/camelize}}Controller = Em.ArrayController.extend({
- content: []
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/collection/generator.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/collection/generator.json b/contrib/views/files/src/main/resources/ui/generators/collection/generator.json
deleted file mode 100644
index 42d3588..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/collection/generator.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "files": [
- {
- "from": "collection.js.hbs",
- "to": "app/controllers/{{pluralName}}.js"
- }
- ],
- "dependencies": []
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/controller/controller.js.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/controller/controller.js.hbs b/contrib/views/files/src/main/resources/ui/generators/controller/controller.js.hbs
deleted file mode 100644
index 66c11bb..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/controller/controller.js.hbs
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.{{#camelize}}{{name}}{{/camelize}}Controller = Em.ObjectController.extend({
- content: null
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/controller/generator.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/controller/generator.json b/contrib/views/files/src/main/resources/ui/generators/controller/generator.json
deleted file mode 100644
index 9da94c8..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/controller/generator.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "files": [
- {
- "from": "controller.js.hbs",
- "to": "app/controllers/{{name}}.js"
- }
- ],
- "dependencies": []
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/model/generator.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/model/generator.json b/contrib/views/files/src/main/resources/ui/generators/model/generator.json
deleted file mode 100644
index e771584..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/model/generator.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "files": [
- {
- "from": "model.js.hbs",
- "to": "app/models/{{name}}.js"
- }
- ],
- "dependencies": []
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/model/model.js.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/model/model.js.hbs b/contrib/views/files/src/main/resources/ui/generators/model/model.js.hbs
deleted file mode 100644
index d5f5ece..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/model/model.js.hbs
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.{{#camelize}}{{name}}{{/camelize}} = DS.Model.extend({
-
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/route/generator.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/route/generator.json b/contrib/views/files/src/main/resources/ui/generators/route/generator.json
deleted file mode 100644
index 8c573b3..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/route/generator.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "files": [
- {
- "from": "route.js.hbs",
- "to": "app/routes/{{name}}.js"
- }
- ],
- "dependencies": []
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/route/route.js.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/route/route.js.hbs b/contrib/views/files/src/main/resources/ui/generators/route/route.js.hbs
deleted file mode 100644
index 5d45dc5..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/route/route.js.hbs
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.{{#camelize}}{{name}}{{/camelize}}Route = Em.Route.extend({
- setupController: function (controller) {
-
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/template/generator.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/template/generator.json b/contrib/views/files/src/main/resources/ui/generators/template/generator.json
deleted file mode 100644
index 579243d..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/template/generator.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "files": [
- {
- "from": "template.hbs.hbs",
- "to": "app/templates/{{name}}.hbs"
- }
- ],
- "dependencies": []
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/template/template.hbs.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/template/template.hbs.hbs b/contrib/views/files/src/main/resources/ui/generators/template/template.hbs.hbs
deleted file mode 100644
index 0efb5b2..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/template/template.hbs.hbs
+++ /dev/null
@@ -1,18 +0,0 @@
-{{!
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-}}
-
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/view/generator.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/view/generator.json b/contrib/views/files/src/main/resources/ui/generators/view/generator.json
deleted file mode 100644
index 79b2da7..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/view/generator.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "files": [
- {
- "from": "view.js.hbs",
- "to": "app/views/{{name}}.js"
- }
- ],
- "dependencies": []
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/generators/view/view.js.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/generators/view/view.js.hbs b/contrib/views/files/src/main/resources/ui/generators/view/view.js.hbs
deleted file mode 100644
index 7e35717..0000000
--- a/contrib/views/files/src/main/resources/ui/generators/view/view.js.hbs
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var App = require('app');
-
-App.{{#camelize}}{{name}}{{/camelize}}View = Em.View.extend({
- templateName: '{{name}}'
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/package.json
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/package.json b/contrib/views/files/src/main/resources/ui/package.json
index f172af8..8250489 100644
--- a/contrib/views/files/src/main/resources/ui/package.json
+++ b/contrib/views/files/src/main/resources/ui/package.json
@@ -1,41 +1,49 @@
{
- "author": "Your Name",
- "name": "package-name",
- "description": "Package description",
- "version": "0.0.1",
- "homepage": "",
- "repository": {
- "type": "git",
- "url": ""
- },
- "engines": {
- "node": "~0.6.10 || 0.8 || 0.9"
+ "name": "files-view",
+ "version": "0.0.0",
+ "description": "Small description for files-view goes here",
+ "private": true,
+ "directories": {
+ "doc": "doc",
+ "test": "tests"
},
"scripts": {
- "test": "node_modules/phantomjs/bin/phantomjs runner.js public/tests.html",
- "start": "brunch watch --server"
+ "build": "ember build",
+ "start": "ember server",
+ "test": "ember test",
+ "preinstall": "chmod +x node/npm/bin/node-gyp-bin/node-gyp",
+ "postinstall": "bash node/with_new_path.sh node node_modules/.bin/bower --allow-root install"
},
- "dependencies": {
- "javascript-brunch": "^1.7.1",
- "css-brunch": "^1.7.0",
- "uglify-js-brunch": "^1.7.7",
- "clean-css-brunch": "^1.7.1",
- "bower": ">= 1.2.8",
- "brunch": "1.7.17",
- "scaffolt": "^0.4.3",
- "ember-precompiler-brunch": ">= 1.5.0",
- "less-brunch": "^1.7.2"
- },
- "devDependencies": {
- "phantomjs": "^1.9.2",
- "karma": "*",
- "karma-qunit": "*",
- "karma-phantomjs-launcher": "~0.1.2",
- "ivy-codemirror": "^1.2.0"
+ "repository": "",
+ "engines": {
+ "node": ">= 0.10.0"
},
- "ignore": [
- "**/.*",
- "node_modules",
- "bower_components"
- ]
+ "author": "",
+ "license": "MIT",
+ "devDependencies": {
+ "bower": "1.7.2",
+ "broccoli-asset-rev": "^2.2.0",
+ "ember-ajax": "0.7.1",
+ "ember-cli": "2.2.0-beta.4",
+ "ember-cli-app-version": "^1.0.0",
+ "ember-cli-babel": "^5.1.5",
+ "ember-cli-dependency-checker": "^1.2.0",
+ "ember-cli-file-picker": "0.0.9",
+ "ember-cli-flash": "1.3.8",
+ "ember-cli-font-awesome": "1.4.0",
+ "ember-cli-htmlbars": "^1.0.1",
+ "ember-cli-htmlbars-inline-precompile": "^0.3.1",
+ "ember-cli-inject-live-reload": "^1.3.1",
+ "ember-cli-less": "1.5.3",
+ "ember-cli-qunit": "^1.1.0",
+ "ember-cli-release": "0.2.8",
+ "ember-cli-sri": "^2.0.0",
+ "ember-cli-uglify": "^1.2.0",
+ "ember-collection": "git://github.com/emberjs/ember-collection.git#bf752508a501161791e3f3b9a546c9b97d5c387a",
+ "ember-data": "2.3.0",
+ "ember-disable-proxy-controllers": "^1.0.1",
+ "ember-export-application-global": "^1.0.4",
+ "ember-keyboard": "0.2.5",
+ "ember-resolver": "^2.0.3"
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/runner.js
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/runner.js b/contrib/views/files/src/main/resources/ui/runner.js
deleted file mode 100644
index 4fd7894..0000000
--- a/contrib/views/files/src/main/resources/ui/runner.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * PhantomJS Runner QUnit Plugin (List Tests) 1.2.0
- *
- * PhantomJS binaries: http://phantomjs.org/download.html
- * Requires PhantomJS 1.6+ (1.7+ recommended)
- *
- * Run with:
- * phantomjs runner-list.js [url-of-your-qunit-testsuite]
- *
- * e.g.
- * phantomjs runner-list.js http://localhost/qunit/test/index.html
- */
-
-/*global phantom:false, require:false, console:false, window:false, QUnit:false */
-
-(function() {
- 'use strict';
-
- var url, page, timeout,
- args = require('system').args;
-
- // arg[0]: scriptName, args[1...]: arguments
- if (args.length < 2 || args.length > 3) {
- console.error('Usage:\n phantomjs runner-list.js [url-of-your-qunit-testsuite] [timeout-in-seconds]');
- phantom.exit(1);
- }
-
- url = args[1];
- page = require('webpage').create();
- if (args[2] !== undefined) {
- timeout = parseInt(args[2], 10);
- }
-
- // Route `console.log()` calls from within the Page context to the main Phantom context (i.e. current `this`)
- page.onConsoleMessage = function(msg) {
- console.log(msg);
- };
-
- page.onInitialized = function() {
- page.evaluate(addLogging);
- };
-
- page.onCallback = function(message) {
- var result,
- failed;
-
- if (message) {
- if (message.name === 'QUnit.done') {
- result = message.data;
- failed = !result || !result.total || result.failed;
-
- if (!result.total) {
- console.error('No tests were executed. Are you loading tests asynchronously?');
- }
-
- phantom.exit(failed ? 1 : 0);
- }
- }
- };
-
- page.open(url, function(status) {
- if (status !== 'success') {
- console.error('Unable to access network: ' + status);
- phantom.exit(1);
- } else {
- // Cannot do this verification with the 'DOMContentLoaded' handler because it
- // will be too late to attach it if a page does not have any script tags.
- var qunitMissing = page.evaluate(function() { return (typeof QUnit === 'undefined' || !QUnit); });
- if (qunitMissing) {
- console.error('The `QUnit` object is not present on this page.');
- phantom.exit(1);
- }
-
- // Set a timeout on the test running, otherwise tests with async problems will hang forever
- if (typeof timeout === 'number') {
- setTimeout(function() {
- console.error('The specified timeout of ' + timeout + ' seconds has expired. Aborting...');
- phantom.exit(1);
- }, timeout * 1000);
- }
-
- // Do nothing... the callback mechanism will handle everything!
- }
- });
-
- function addLogging() {
- window.document.addEventListener('DOMContentLoaded', function() {
- var currentTestAssertions = [];
-
- QUnit.log(function(details) {
- var response;
-
- console.log((details.result ? "? ": "? ") + details.message);
-
- if (!details.result) {
- response = details.message || '';
-
- if (typeof details.expected !== 'undefined') {
- if (response) {
- response += ', ';
- }
-
- response += 'expected: ' + details.expected + ', but was: ' + details.actual;
- }
-
- if (details.source) {
- response += '\n' + details.source;
- }
-
- console.log(' Failed assertion: ' + response);
- }
- });
-
- QUnit.moduleStart(function( details ) {
- if (details.name) {
- console.log('\n' + details.name);
- }
- });
-
- QUnit.testStart(function(result) {
- console.log('\n' + result.name);
- });
-
- QUnit.done(function(result) {
- console.log('\n' + 'Took ' + result.runtime + 'ms to run ' + result.total + ' tests. ' + result.passed + ' passed, ' + result.failed + ' failed.');
-
- if (typeof window.callPhantom === 'function') {
- window.callPhantom({
- 'name': 'QUnit.done',
- 'data': result
- });
- }
- });
- }, false);
- }
-})();
[09/10] ambari git commit: AMBARI-15145. Revamped Filebrowser Design
- UI. (dipayanb)
Posted by db...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b988562a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.svg
----------------------------------------------------------------------
diff --git a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.svg b/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.svg
deleted file mode 100644
index 45fdf33..0000000
--- a/contrib/views/files/src/main/resources/ui/app/assets/fonts/fontawesome-webfont.svg
+++ /dev/null
@@ -1,414 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="fontawesomeregular" horiz-adv-x="1536" >
-<font-face units-per-em="1792" ascent="1536" descent="-256" />
-<missing-glyph horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="	" horiz-adv-x="448" />
-<glyph unicode=" " horiz-adv-x="448" />
-<glyph unicode="¨" horiz-adv-x="1792" />
-<glyph unicode="©" horiz-adv-x="1792" />
-<glyph unicode="®" horiz-adv-x="1792" />
-<glyph unicode="´" horiz-adv-x="1792" />
-<glyph unicode="Æ" horiz-adv-x="1792" />
-<glyph unicode=" " horiz-adv-x="768" />
-<glyph unicode=" " />
-<glyph unicode=" " horiz-adv-x="768" />
-<glyph unicode=" " />
-<glyph unicode=" " horiz-adv-x="512" />
-<glyph unicode=" " horiz-adv-x="384" />
-<glyph unicode=" " horiz-adv-x="256" />
-<glyph unicode=" " horiz-adv-x="256" />
-<glyph unicode=" " horiz-adv-x="192" />
-<glyph unicode=" " horiz-adv-x="307" />
-<glyph unicode=" " horiz-adv-x="85" />
-<glyph unicode=" " horiz-adv-x="307" />
-<glyph unicode=" " horiz-adv-x="384" />
-<glyph unicode="™" horiz-adv-x="1792" />
-<glyph unicode="∞" horiz-adv-x="1792" />
-<glyph unicode="≠" horiz-adv-x="1792" />
-<glyph unicode="" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
-<glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
-<glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t1
9 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28
t28 -68z" />
-<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
-<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
-<glyph unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
-<glyph unicode="" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
-<glyph unicode="" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
-<glyph unicode="" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
-<glyph unicode="" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
-<glyph unicode="" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
-<glyph unicode="" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -1
13 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
-<glyph unicode="" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
-<glyph unicode="" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
-<glyph unicode="" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
-<glyph unicode="" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
-<glyph unicode="" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
-<glyph unicode="" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
-<glyph unicode="" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
-<glyph unicode="" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
-<glyph unicode="" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
-<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
-<glyph unicode="" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
-<glyph unicode="" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t
-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
-<glyph unicode="" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
-<glyph unicode="" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
-<glyph unicode="" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
-<glyph unicode="" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
-<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
-<glyph unicode="" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
-<glyph unicode="" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
-<glyph unicode="" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
-<glyph unicode="" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
-<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
-<glyph unicode="" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
-<glyph unicode="" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
-<glyph unicode="" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
-<glyph unicode="" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
-<glyph unicode="" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
-<glyph unicode="" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
-<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
-<glyph unicode="" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
-<glyph unicode="" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
-<glyph unicode="" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
-<glyph unicode="" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
-<glyph unicode="" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
-<glyph unicode="" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
-<glyph unicode="" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
-<glyph unicode="" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
-<glyph unicode="" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
-<glyph unicode="" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
-<glyph unicode="" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
-<glyph unicode="" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
-<glyph unicode="" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152
-23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
-<glyph unicode="" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
-<glyph unicode="" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
-<glyph unicode="" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
-<glyph unicode="" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
-<glyph unicode="" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
-<glyph unicode="" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
-<glyph unicode="" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5
-68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
-<glyph unicode="" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
-<glyph unicode="" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
-<glyph unicode="" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
-<glyph unicode="" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
-<glyph unicode="" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
-<glyph unicode="" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
-<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
-<glyph unicode="" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
-<glyph unicode="" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
-<glyph unicode="" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
-<glyph unicode="" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
-<glyph unicode="" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
-<glyph unicode="" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
-<glyph unicode="" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
-<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
-<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17
t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-1
5 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q
-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27
<TRUNCATED>