From 1ecdd095a2e265d6ed99770c9ba4009c7f7f7903 Mon Sep 17 00:00:00 2001 From: Ruel Tmeizeh - RuhNet Date: Sun, 2 Mar 2025 17:59:33 -0500 Subject: [PATCH] Storage App --- app.js | 615 +++++++++++++++++++++++++ i18n/en-US.json | 33 ++ metadata/app.json | 26 ++ metadata/icon/storage.png | Bin 0 -> 18066 bytes metadata/screenshots/storage1.png | Bin 0 -> 35807 bytes storages.js | 8 + style/app.css | 295 ++++++++++++ style/app.scss | 442 ++++++++++++++++++ style/static/images/mts.svg | 23 + submodules/mts/i18n/en-US.json | 12 + submodules/mts/img/logo.png | Bin 0 -> 18286 bytes submodules/mts/mts.js | 48 ++ submodules/mts/views/formElements.html | 26 ++ submodules/mts/views/logo.html | 1 + submodules/s3/i18n/en-US.json | 12 + submodules/s3/img/logo.png | Bin 0 -> 5526 bytes submodules/s3/s3.js | 48 ++ submodules/s3/views/formElements.html | 25 + submodules/s3/views/logo.html | 1 + views/field-path.html | 5 + views/item-settings.html | 17 + views/layout.html | 32 ++ views/new-item.html | 44 ++ 23 files changed, 1713 insertions(+) create mode 100644 app.js create mode 100644 i18n/en-US.json create mode 100644 metadata/app.json create mode 100644 metadata/icon/storage.png create mode 100644 metadata/screenshots/storage1.png create mode 100644 storages.js create mode 100644 style/app.css create mode 100644 style/app.scss create mode 100644 style/static/images/mts.svg create mode 100644 submodules/mts/i18n/en-US.json create mode 100644 submodules/mts/img/logo.png create mode 100644 submodules/mts/mts.js create mode 100644 submodules/mts/views/formElements.html create mode 100644 submodules/mts/views/logo.html create mode 100644 submodules/s3/i18n/en-US.json create mode 100644 submodules/s3/img/logo.png create mode 100644 submodules/s3/s3.js create mode 100644 submodules/s3/views/formElements.html create mode 100644 submodules/s3/views/logo.html create mode 100644 views/field-path.html create mode 100644 views/item-settings.html create mode 100644 views/layout.html create mode 100644 views/new-item.html diff --git a/app.js b/app.js new file mode 100644 index 0000000..95b8e9c --- /dev/null +++ b/app.js @@ -0,0 +1,615 @@ +define(function(require) { + var $ = require('jquery'), + monster = require('monster'), + toastr = require('toastr'), + storagesConfig = require('./storages'); + + var settings = { + debug: false + }; + + var log = function(msg){ + if(settings.debug) { + console.log(msg); + } + }; + + // Autoload submodules + // (Submodules should be described in /apps/storagemgmt/storages.js) + var storagesList = storagesConfig.storages; + var storagesPaths = []; + for (var i = 0, len = storagesList.length; i < len; i++) { + storagesPaths.push('./submodules/' + storagesList[i] + '/' + storagesList[i]) + } + require(storagesPaths); + + var storageManager = { + name: 'storagemgmt', + css: [ 'app' ], + requests: {}, + + subscribe: { + 'storagemgmt.fetchStorages': 'define_storage_nodes' // For all submodules + }, + + subModules: storagesList, + + storages: {}, + + i18n: { + 'en-US': { customCss: false } + }, + + load: function(callback) { + var self = this; + + self.initApp(function() { + callback && callback(self); + }); + }, + + initApp: function(callback) { + var self = this; + + monster.pub('auth.initApp', { + app: self, + callback: callback + }); + }, + + render: function(container) { + var self = this; + + monster.pub('storagemgmt.fetchStorages', { + storages: self.storages, + callback: function (args) { + self.extendI18nOfSubmodule(args); + } + }); + + monster.ui.generateAppLayout(self, { + menus: [ + { + tabs: [ + { + callback: self.storageManagerRender + } + ] + } + ] + }); + + $(document.body).addClass('storagemgmt-app'); // class for styles; + }, + + extendI18nOfSubmodule: function (args) { + var self = this; + if(args.i18n && args.submoduleName) { + var submoduleLanguages = args.i18n; + var curLanguage = self.i18n.hasOwnProperty(monster.config.whitelabel.language) ? monster.config.whitelabel.language : monster.defaultLanguage; + + if (submoduleLanguages.length && submoduleLanguages.length > 0) { + if(submoduleLanguages.indexOf(curLanguage) > -1) { + $.getJSON('/apps/storagemgmt/submodules/' + args.submoduleName + '/i18n/' + curLanguage + '.json').done(function (newDict) { + var dict = self.data.i18n[curLanguage]; + $.extend(true, dict, newDict); + }) + } + } + } else { + log('Extend i18n of submodule failed'); + } + }, + + storageManagerRender: function(pArgs) { + var self = this, + args = pArgs || {}, + $container = args.container || $('.app-content-wrapper'), + callback = args.callback; + + if(pArgs.hasOwnProperty('onSetDefault') && typeof(pArgs.onSetDefault) === 'function') { + self.storageManagerOnSetDefault = pArgs.onSetDefault; + } + + if(!monster.util.isAdmin()) { + log('Permission error. Use admin account for change storage settings'); + return; + } + + self.getStorage(function(data) { + var storagesData = self.storageManagerFormatData(data); + for (var i = 0, len = storagesData.length; i < len; i++) { + storagesData[i].logo = self.storages[storagesData[i].type].getLogo() + } + + log('Storages List:'); + log(storagesData); + + var template = $(self.getTemplate({ + name: 'layout', + data: { + storages: storagesData + } + })); + + self.storageManagerBind(template, args, storagesData); + + $container.empty() + .append(template); + + if(typeof(callback) === 'function') { + callback(data); + } + }); + }, + + _doStorageInitialRequest: function(callback) { + var self = this; + + self.callApi({ + resource: 'storage.add', + data: { + accountId : self.accountId, + data : { + 'attachments': {}, + 'plan': {} + }, + removeMetadataAPI: true, + generateError: settings.debug + }, + success: function(data) { + if(typeof(callback) === 'function') { + callback(data); + } + }, + error: function(error) { + var errorMessage = self.i18n.active().storagemgmt.universalErrorMessageTemplate.replace('%api%', 'Storage'); + monster.ui.alert(errorMessage); + log(error.status + ' - ' + error.error + ': ' + error.message + ' '); + } + }); + }, + + getStorage: function(callback) { + var self = this; + + self.callApi({ + resource: 'storage.get', + data: { + accountId: self.accountId, + removeMetadataAPI: true, + generateError: false + }, + success: function(data) { + log('Storage Data:'); + log(data.data); + callback(data.data); + }, + error: function(data, error, globalHandler) { + self._doStorageInitialRequest(function() { + self.getStorage(callback); + }); + } + }); + }, + + storageManagerUpdateStorage: function(storageData, callback) { + var self = this; + + if(!monster.util.isAdmin()) { + log('Permission error. Use admin account for change storage settings'); + return; + } + + self.callApi({ + resource: 'storage.update', + data: { + accountId: self.accountId, + removeMetadataAPI: true, // or generateError: false + data: storageData + }, + success: function(data, status) { + if(typeof(callback) === 'function') { + callback(data); + } + }, + error: function(data, error, globalHandler) { + if (error.status === 404) { + callback(undefined); + } else { + globalHandler(data); + } + } + }); + }, + + storageManagerPatchStorage: function(storageData, callback) { + var self = this; + + if(!monster.util.isAdmin()) { + log('Permission error. Use admin account for change storage settings'); + return; + } + + self.callApi({ + resource: 'storage.patch', + data: { + accountId: self.accountId, + removeMetadataAPI: true, // or generateError: false + data: storageData + }, + success: function(data, status) { + if(typeof(callback) === 'function') { + callback(data); + } + }, + error: function(data, error, globalHandler) { + if (error.status === 404) { + callback(undefined); + } else { + globalHandler(data); + } + } + }); + }, + + storageManagerFormatData: function(data) { + var activeStorageId = null; + try { + activeStorageId = data.plan.modb.types.call_recording.attachments.handler; + } catch(e) { + log('Active storage not found'); + } + var itemData; + var storagesList = []; + if(data && data.hasOwnProperty('attachments') && Object.keys(data.attachments).length > 0) { + var attachments = data.attachments; + for(var i in attachments) if(attachments.hasOwnProperty(i)) { + itemData = { + id: i, + type: attachments[i].handler, + name: attachments[i].name, + settings: attachments[i].settings, + isActive: false + }; + + if(activeStorageId && itemData.id === activeStorageId) { + itemData.isActive = true; + } + storagesList.push(itemData) + } + } + + return storagesList; + }, + + storageManagerBind: function(template, args, data) { + var self = this; + + template.on('click', '.js-edit-storage', function(e) { + e.preventDefault(); + + var $editStorageBtn = $(this); + self.getStorage(function(data) { + + var $storageItem = $editStorageBtn.closest('.js-storage-item'); + var storageType = $storageItem.data('type'); + var uuid = $storageItem.data('uuid'); + var $container = $storageItem + .find('.js-item-settings-wrapper') + .hide(); + + if(data.attachments.hasOwnProperty(uuid)) { + var storageData = data.attachments[uuid]; + } + + var template = self.getTemplate({ + name: 'item-settings', + data: { + formElements: self.storages[storageType].getFormElements(storageData) + } + }); + + $container.empty() + .append(template); + $container.slideDown(); + + self.storageManagerSettingsBind($container); + }) + }); + + template.on('click', '.js-remove-storage', function(e) { + e.preventDefault(); + var uuid = $(this).closest('.js-storage-item').data('uuid'); + monster.ui.confirm(self.i18n.active().storagemgmt.confirmDeleteText, function() { + self.storageManagerDeleteStorage(uuid, function() { + $('.js-storage-item[data-uuid="' + uuid + '"]').slideUp(400, function() { + $(this).remove(); + }); + self.storageManagerShowMessage(self.i18n.active().storagemgmt.successRemovingMessage); + }); + }, undefined, { + type: 'warning', + title: self.i18n.active().storagemgmt.confirmDeleteTitle, + confirmButtonText: self.i18n.active().storagemgmt.confirmDelete + }); + }); + + template.on('click', '.js-create-storage', function(e) { + e.preventDefault(); + var $newStorageItem = $('.js-storage-items .js-new-storage-item'); + if ($newStorageItem.length === 0) { + self.storageManagerShowNewItemPanel(); + } else { + $newStorageItem.addClass('flash-effect'); + (function($newStorageItem){ + var timeoutId = setTimeout(function() { + $newStorageItem.removeClass('flash-effect'); + }, 2000) + })($newStorageItem) + } + }); + + template.on('click', '.js-set-default-storage', function(e) { + e.preventDefault(); + var uuid = $(this).closest('.js-storage-item').data('uuid'); + var isAlreadyActive = $(this).closest('.js-storage-item').hasClass('active-storage'); + + if(isAlreadyActive) { + self.storageManagerShowMessage(self.i18n.active().storagemgmt.alreadyActiveMessage, 'warning') + } else { + self.storageManagerSetDefaultStorage(uuid); + } + }); + }, + + storageManagerShowNewItemPanel: function(){ + var self = this; + + var data = []; + + var keyword = ''; + var storagesList = Object.keys(self.storages); + for (var i = 0, len = storagesList.length; i < len; i++) { + keyword = storagesList[i]; + data.push({ + name: keyword, + type: keyword, + logo: self.storages[keyword].getLogo(), + tabId: keyword + '-new-item-content', + tabLink: '#' + keyword + '-new-item-content', + formElements: self.storages[keyword].getFormElements({}) + }) + } + + var template = $(self.getTemplate({ + name: 'new-item', + data: { + storages: data + } + })); + + self.storageManagerNewItemBind(template); + + $('.js-storage-items').append(template); + $('.js-new-storage-item').hide().slideDown(400, function(){}); + $('.js-new-storage-tabs').tabs(); + }, + + storageManagerNewItemBind: function(template) { + var self = this; + + template.on('click', '.js-save', function (e) { + e.preventDefault(); + + var $tab = $(this).closest('.js-tab-content-item'); + var $form = $tab.find('.js-storage-settings-form'); + var formData = monster.ui.getFormData($form[0]); + var isNeedSetDefault = $tab.find('input[name="set_default"]').is(':checked'); + var typeKeyword = $tab.data('type'); + var newUuid = self.storageManagerGenerateUUID(); + delete formData['set_default']; + var storageData = self.storageManagerMakeConfig(typeKeyword, formData, newUuid); + + self.storageManagerPatchStorage(storageData, function(){ + var renderArgs = { + callback: function () { + self.storageManagerShowMessage(self.i18n.active().storagemgmt.successSavingMessage, 'success'); + } + }; + + if(isNeedSetDefault) { + self.storageManagerSetDefaultStorage(newUuid, function () { + self.storageManagerRender(renderArgs); + }); + } else { + self.storageManagerRender(renderArgs); + } + }); + }); + + template.on('click', '.js-cancel', function (e) { + e.preventDefault(); + $('.js-new-storage-item').slideUp(400, function(){ + $('.js-new-storage-item').remove(); + }); + }); + }, + + storageManagerMakeConfig (storageKeyword, data, uuid) { + var self = this, + storageData = { + 'attachments': {} + }; + + if(typeof(uuid) === 'undefined') { + uuid = self.storageManagerGenerateUUID(); + } + + if(storageKeyword && self.storages.hasOwnProperty(storageKeyword)) { + storageData.attachments[uuid] = data; + return storageData; + } else { + monster.ui.alert('Please install storage correctly (' + storageKeyword + ')'); + } + }, + + storageManagerSetDefaultStorage: function(uuid, callback) { + var self = this; + + if(!monster.util.isAdmin()) { + log('Permission error. Use admin account for change storage settings'); + return; + } + + var newData = { + plan: { + modb: { + types: { + call_recording: { + attachments: { + handler: uuid + } + }, + mailbox_message: { + attachments: { + handler: uuid + } + } + } + }, + account: { + types: { + media: { + attachments: { + handler: uuid + } + } + } + }, + } + }; + + + self.storageManagerPatchStorage(newData, function(data) { + $('#storage_manager_wrapper').find('.js-storage-item') + .removeClass('active-storage'); + + $('.js-storage-item[data-uuid="' + uuid + '"]').addClass('active-storage'); + + self.storageManagerOnSetDefault(data); + callback && callback(data); + }); + }, + + storageManagerOnSetDefault: function(data) {}, + + storageManagerSettingsBind: function($settingsContainer) { + var self = this; + + $settingsContainer.find('.js-cancel').on('click', function(e) { + e.preventDefault(); + $settingsContainer.slideUp(400, function(){ + $settingsContainer.empty(); + }); + }); + + $settingsContainer.find('.js-save').on('click', function(e) { + e.preventDefault(); + var $storageItem = $(this).closest('.js-storage-item'); + var $form = $storageItem.find('.js-storage-settings-form'); + var formData = monster.ui.getFormData($form[0]); + var storageName = formData.name; + var typeKeyword = $storageItem.data('type'); + var uuid = $storageItem.data('uuid'); + var storageData = self.storageManagerMakeConfig(typeKeyword, formData, uuid); + + self.getStorage(function(existStorageData) { + self.storageManagerPatchStorage(storageData, function(data) { + // update item name + $('.js-storage-item[data-uuid="' + uuid + '"]').find('.js-storage-name').text(storageName); + self.storageManagerShowMessage(self.i18n.active().storagemgmt.successUpdate, 'success'); + }); + }); + + }); + }, + + storageManagerDeleteStorage: function(uuid, callback) { + var self = this; + + if(!monster.util.isAdmin()) { + log('Permission error. Use admin account for change storage settings'); + return; + } + + self.getStorage(function(storagesData) { + var resultData = {}; + if(storagesData.hasOwnProperty('attachments')) { + resultData.attachments = storagesData.attachments; + } + if(storagesData.hasOwnProperty('plan')) { + resultData.plan = storagesData.plan; + } + + if(resultData.attachments && resultData.attachments.hasOwnProperty(uuid)) { + delete resultData.attachments[uuid]; + } + + try { + if(resultData.plan.modb.types.call_recording.attachments.handler === uuid) { + resultData.plan = {}; + } + } catch (e) {} + + self.storageManagerUpdateStorage(resultData, function() { + if(typeof(callback) === 'function') { + callback(); + } + }); + }) + }, + + storageManagerGenerateUUID: function() { + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + }, + + storageManagerShowMessage: function(msg, msgType) { + var msgTypeClass; + + if(typeof(msgType) === 'undefined') { + msgType = 'info'; + } + + switch(msgType) { + case 'warning': + msgTypeClass = 'storage-msg-warning'; + break; + case 'success': + msgTypeClass = 'storage-msg-success'; + break; + default: // 'info' + msgTypeClass = 'storage-msg-info'; + } + + var $msg = $('
' + msg + '
') + .appendTo($('.js-storage-msg-box')).hide().fadeIn(); + + $msg.animate({ + backgroundColor: '#ffffff' + }, 1000 + ); + + window.setTimeout(function(){ + $msg.fadeOut(400, function() { + $msg.remove(); + }) + }, 4000); + } + }; + + return storageManager; +}); diff --git a/i18n/en-US.json b/i18n/en-US.json new file mode 100644 index 0000000..5701b8c --- /dev/null +++ b/i18n/en-US.json @@ -0,0 +1,33 @@ +{ + "storagemgmt": { + "title": "Storage Engine Management", + "description": "The Storage Engine Management app allows you manage your storage", + "universalErrorMessageTemplate": "Please contact your system administrator to configure %api% API, required for this application to work", + "welcome": "Welcome {{variable}} to the Storage Engine Management App", + "settingsBtnText": "Settings", + "settingsTitle": "Storage settings", + "newStorageBtnText": "New storage", + "itemSettings": { + "nameLabel": "Storage name", + "bucketLabel": "Bucket name", + "keyLabel": "Key", + "secretLabel": "Secret", + "saveBtnText": "Save Changes", + "cancelBtnText": "Cancel", + "successUpdate": "Your Storage Settings were successfully updated!", + "setDefaultLabel": "Set default" + }, + "newItem": { + "saveNewItemText": "Create", + "cancelBtnText": "Cancel" + }, + "confirmDelete": "Yes, Remove Storage", + "confirmDeleteText": "This will remove this Storage from this account.", + "confirmDeleteTitle": "Warning! Are you sure?", + "successRemovingMessage": "You successfully removed the storage.", + "successSavingMessage": "You successfully saved the storage.", + "successUpdate": "Your Storage Settings were successfully updated!", + "alreadyActiveMessage": "This storage is already active", + "storageError": "Stores do not work correctly. Contact your administrator to configure it." + } +} diff --git a/metadata/app.json b/metadata/app.json new file mode 100644 index 0000000..dac454f --- /dev/null +++ b/metadata/app.json @@ -0,0 +1,26 @@ +{ + "name": "storage", + "i18n": { + "en-US": { + "label": "Storage", + "description": "The storage management app allows you to configure storage" + } + }, + "tags": [ + "reseller" + ], + "icon": "storage.png", + "api_url": "", + "author": "(C) 2019 CONVERBA LIMITED/2025 RuhNet", + "version": "1.0", + "license": "MPL", + "price": 0, + "screenshots": [ + "storage1.png" + ], + "urls": { + "documentation": "{documentation_url}", + "howto": "{howto_video_url}" + }, + "pvt_type": "app" +} diff --git a/metadata/icon/storage.png b/metadata/icon/storage.png new file mode 100644 index 0000000000000000000000000000000000000000..546222adcd5ff538ab9f07f605f008f04cacc12f GIT binary patch literal 18066 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 literal 0 HcmV?d00001 diff --git a/metadata/screenshots/storage1.png b/metadata/screenshots/storage1.png new file mode 100644 index 0000000000000000000000000000000000000000..67984d1bf733c0555166a84e338be942c0e55084 GIT binary patch literal 35807 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�b}z)qDZPu)LB)m6HR5MaJNVwC_66`W7(3sJ z;rs(~DnTM4*1{Vt4CP+Io5!EGHi0y?6qYaM+pQBsdV+PQo2Il^D7w#84fal^u%sIF_u;8}ROwr2n=V9StJEkJ``s_JMEUP>LizOm{ zKMidyb{CCs)^)-oY`~jd5Gu#m4U6jJs9R0n_LgA%X@#}* zClrhqM+;7|gdVEQxdJW|;IsSaiSC>MZ*11De)l8Kjqk;LH>yYLoY$4-Y;-=_Rx%g= zbWgg&-pv0VwnJuSs!8@XMY{$FO{iQS|9bq!tQ8OEe4$-yU9l;3+X3tI^e~Z1*IR4E zN^@_|ckO%}PprvN?I8!M{^M42Wu_OmwpR{v+oRK)yQ8h#BJ%Q~9;~dUK!ci+zeoqZ zMD>rdoAs@aPZL^1GehU%Bxj}3=BYW>eSOtVG zudeSqiiiuc{n$-uCn9x-?lLr#+s}7cqa!e~`I;I(g2LXlch86jeAF4dEZ88q`qU#{ zZ$Gx(>fnQa?n5h?z`@8j5ohr(KRbHjM{M^c(BhVd6kqi(f@vO#kdW8;iKcygB_YtJ zVk~=Qpni1^t+R3<{ygq_{AEw$wFmeea_%^HnXJ$Tz&+bjv>gVMb$l~DjTsuVT_YD% zJNfB=_O^a8f7eXrp?5vT&TNbyrxc)-e0nTh)&iD|M07C;{3{HiX3=vfNw50j3cwS0 zcz&(EkjK!3h?v&ZgCz&HUbZ_ch?4u&Qxw(bH-$Jd{8HN~`V-n0w8x-J<9N@*j{m{K z07(^C#irHsv-aB7KOe3UYxm=(x9RygCP zS}9&btAyi!S?ZDAV=nB+s1lu5@r@IvRE@u^pE~cjFobH0C6c+F;nxsqa%f_y<^||M z&$xbZ&Ee<5;YWH^*%XDv|D=}nsle2Ee!>t@R4jl26rpb@B)%a@=yw`qE|-CPyM@_m>UdUgq=oPTeng-4cPGmp z11B!j_1`itibgdU@+)$)tcsHNqgY;_Gkh@`3NEn1EMz$y)q~V(z8g(Pmjzy^t?U~d zJQp$bpm0=TsZJX^|7;<`-t^S4og^P$fg^{pkLty1-;mlay&7CWlY-?QMt+zhw1DP()j1mfdo$k)W#ozg-kNY+1- zZHH#@D$(;9W(v5~>>Uh$5Q9|39BC@=y8~ueCSvc=Mpz%YIWoy9-ki`9eZJqQGw#aR z#FZ$RA@0PfvkJF)xf$w@w_RXz+{YjctaWZCa?z%G=KE`$Z9bvN|IabxQCv=!qJN1_ zEbi@*Is^0Zx&1LN5H=OUtYUJi-PphpT)4)^HH3JTZ1W?Q!*a%xCg36VhBdQT z08PsYwA~4u%>@YOsF&l7Wu#cvn^+-(ee7gs+<1QEM9K6gDqzX{wFawbE8vFov^j7v zjsdChol~*O1H$C&5y@=o;C93#Jp?!khrPo#@4Ar_m3Y)Q%fBy|1=Od0bXjHSoi?^N zglBd+3B!@r42`(-8EJSN)C({qznfl%gL`p#wE7le1GHy73ghYGU&A18NP~~#TcRaD zZG+e0!Uj>y7FE|GYF^A%bm-Q!X6~#{8g;ZECq$cLUr7gj+9y~#5rx}<# zC~*PrTCN2L;gn9w0Pnf~%HB(3pGh~^luG^gS_?myR}b$?ad~#@7{^sZvm@^TR_&i= z>c4i3F(@;2=LD;!v~UUx7hymiT^DgCQZ`9F+o@x(m-W?NPGhkEb#YV znfUro`()t3|E_f1|FP~~g!{|dFXxW!e8~zDkPGn)d*H^(BmUNEc%L$IhcCn{GW(9w>nUN6!OAZ^anX`NH9`p}9?FWGi8zrsv=zhRnMuq`*^vMYHzH-Ml6eWt<$02$4JE&!inQSHo*4!mkn)1F@sw4^$_X{%Ohle|28dEwzp2FYr}1>PCd(1PsU5CI}~i)1ltDS9IjL{fiA zrbN%dIe)vs>4XA!ehDpCx%*4{({Twxj4_z(6iK$lHHaX7FDT?pe9O0=uCoE|E@e`L>R-VXsZoo5*iynyYg zp!RdpsfSXGq{Q6ZrrFDF82zkzmx7MXyA;cJ-QcLX^XrY(OOsQ_Y~DrO_{k8_-6ADQ zGNK3$L4CWVr}a0$&_szbaPXb5%Lg14nEHx@ z@hi#z#6kj?uKuP%nYYoI^S9y=+Z(Bg4yT+M;8!Bf58AbwyZ+!2W@xpmgo|HD({<+& zy~lr!Vd#ubtBbL5P@7-td-IGe-IU3rNX;Mi2463VEi&pr?Jk-8q)UKKte?Y3gq3%$ zYTVv`mC`vwe1PJKE1@4&`iVbt*z1J=%*_zk)SK?-C%&qNl-5};T8bkYNvk0n*v_l} z=rmkQ*jJ&6kCA6IGBK(}chqa9`PzCa+vvH6eOGqa(RF<#;M2Rqre<6`xFTw8FTEn| zF`tKKRaQsp_3NH(K}uTfy>ePHJVF{`nh}J4Q?FaeC$A?6_bx2g;AUWxMeNnljP$${b5C z#tANmZ*oPeF@g5e*9#{5kU|lX@XlV~OY2 z)#&NF4P<)8m%d&d z+HkveF^INyt3~OJgtcR_F3+}J<)9|KHi%q3mbbWa}zR3c;y^xez0H26We!>6oXRQ?SK)%ENf{>zRy>%b`T#0=qOPqHa)~2?W zGuZ=A$oWZ(I+`7tri}0RUPlC= zhdOcvkfXK(viE0hJoSLvzYTM0nUNa{LMDGUJEb!x1EBc7J#BMz;x|cs{2F`J!o8^MTE_U=#l}pdYcD8va>1Z9FK2~Dk445+kl zHER0-xTg%wl!IrNDp~*{Rg&%jrMv0wJYUsW1k~eV$nYCAOJjzq82jp0i?72#B)im4 zGD^VcB6iZhJp<=X`=%u=$SI?s!B?|M;|or-4~L5+L%V!~dTMUDE`QEyu&3h`Fo+_@ zw)H+)3_F>?l{YnH`nwuL%r`-t@p6qZ^unl1mpv|A4I$v13+2lrIx!v*fq{q zi1(75V;y;HQkhVO68XzDl%}DG!Wk+XZ0u@30>dy-us3X{r2e+MUVm5*y{o+9Ke=?m zK7euMR!cO@22!gho2#BP&fm5(!T8_<`JOE5>?pd6$PIklT-7|b{?a?ie?; z70dmiaxb&xz{X*)kJjfQ)1htQ_uu#w`*l#KE7T3&(1Hufz8+&xvMx|&jlgU-^1U{YUd^^Yc!)`aaJYg0%9TR&2BfU8GRo&<5_{+2d ze3i;SZ2!C^77imj_^Uj4b0x}pkCzi~Q-ri=CA~{8DH?L-u-cW6` zg5l?AaN%k5SU(;`AHntBJMz+_*Cp6E8SI!D0I@?})c|obCXXg7d+hsyS35a#W(O%_ zG0JMZV|Sf`2F#R`hovcBWi4K+{oB{eILzNmm}p6W>2cD~6NJ!p?AtbCEg_~l#d!!g zJLhw}h?1eF8yepGl%em+!(y!hnQNs$Tn@~|$^mQQ5K?8#A*i93nL61*E`+1HqF|E= zsn2f%3F-gR60OEPdd{jQ{rqfa%;T+{Q=y@Dn;TuD0)Fdz42eDOx_(xb!4G`G8RH1( zd9(ZUzoBv-Cm2g#ZgPl}SKQ8;CAsH&ojZDMSGbloImdEPMtDuLv-86TELGD1xJNb~?7EJ$q`-)<*r)({MWTMx}=24UH0~YUJMyr3ENW;AqjkmE< z@(&EE6jro2liq?(amxqYgQ4Khv+O_Y?IW3Y0HeCepMV@Mmxb`2*esP}`aHCUW^LqD z491j%=)Oxlu?c1V4YR`UzG;bWLT#7nvgoir@w@e|ek~u1E7lvIpO7@ZRR(UU!lLhr zGU!Umb08&8RtYOad2D4xPY#}C`0j(HXB_yfe);jKN2z(!!HrsZGS+a|R)Rh6NflBR4!K-6Vv0}vlJoI%D0789ftZEh{pT74RE=xYF8HdZGV`w}UT92VUlqW+ zejn)Mi@w!-ZC^3tN(C=>ouS1A7qiRxpX+a9Zh7QNy%``eK4mom0;Q=NJZ;gtHp7LU zQ+h1R=W9a1rxA_cIdK94{rNb|py=!?*N@Sp3n~XW1vWQ##QD%&zB+T_qhqS*`WdIq z`@y$fJT6$i1eN{AkkH;u2F81(`I=6ojxXcTbE?rRe}ic%`S{POcekGcas#^l)gmv) zk35U~8(2}jS8XaY3ADJkHG5C(O(>X}>dWug;lG5O{Euw4pDG|xxc31l_G$7Pv*Mzd()HH=O%h8!p~_od9<5jU$&lyw=jrAD3a0o! zG8z8?%KCeBA`wC9N27<&5eU%!ur;3rdYo(FFFHaE^yZd|!~Qs>e^5{=t+3d>YtoGG zsUVshYU+>5JM-I)rn92t8f-Kc=J@6HRa(-l^8wnSxJA7)hFLO))M;y~=BJn5v~E{d zaOJYXHTH_5z!B7QpN}y|3v-@9RC|kUosSe!P*lQ6NU7NCh_|^(g0LD!X*AQEQ!*B8_FRP+brF z#_}t5tWj{xrf!dd7PWg;>Jg`}w>JMe&;s$&!zj z`}Pd7(|yKNQk27v7hfLI87uLcE2!Mm{@Zjllln^dBF>~K#G5NOOy6S#>BSHGbWK$D zLg$_&cx3I?`H%652`NtM7@O_J42wwK%R5Uc=D%m%8udytzAzM8aYg>SDF#W1>SdE= z)8$EvzR+^bZY3X~cDap+&6*t}i%PVn}3*5Pa~ zJ-l5Ia3+l9R*x1&l1r?AlQpd{#JmMc*z;Pln=AgjpQ6E0owc;PQ|!|H@Jltk#TvvT1Eo4g&A@m)u=u+}l8V=JA+#U!ZPZfc@2d#V(6lIDJK znSG$e0@ZV=cKgnCJ442R(c42bI8vKjt5cQ8H7@Y!fGBNT|7HRg-1kyw*1hON?Oa>I z1#wPxJb`(Xt2<4YQ`=|&+FTJo3rQNPrt!Yj4f70Cvu{hEdYNgzSOa+<*CRSCRULNG zDKp#b!*-Jy9?tG=G+HY~u?|SChFBc=y`60&V!e5~WFNZQEoJ+f`i3l$#`if{E+|SDc>-$t*9Sb-wulZE@^jMxx1uY< zr`LII(8f~XOy^$lo~})vuFMg)@fWLBAAzaz41Vj;UAE-PUaA}`v9*q?(9L>x_cuK3 zy>jf72tEJAkW{2HR7T8?bg!;#L^&G8ttbIV?Mh5f+V93!8m|iwT1x%w>yIiM((`a| zew_H(@2&sr_4P^RC-!T|^BsGDwvF~NQc`!eU(nSL_5+j&%YtTgaDyicYH-q0sgL42 zfaTRfH`m?}bPKmie{Bz6y*r1uowKpC#HC%&EUEzZwbu%C8OL$VPe~2k1KACN41`A5EMV z4#+v-&3JPaBL$pMIu&<^Et=JjqN`v3O}2H&R8X;*@FjccbKO>tUX~Y><{!o{t!TzM zw(&Cfef?T#6m3j5++#n3*}O*P=dkzp!Y<`jXtiMv?ma`R3Eb+=Rsh2wmbc04G9;2_ zYJ5$aaLU~({}~g*N`dWoTe%2ip8pp2dmSAY*5>GJn+5NQS+1`|E@QIGW*wU*m(v}N zjP$WDmEx9KcKUYTqK^yi|GWn7`nIE?=EQp<1@j{7MbUf^`_rkUizhuNUxilCs-m(z z4p%N})$#kB%66j{nY=0SFQXc4pAgbR&`;8?SI1h#(yUBu*s5~KK#bxnN^d1`)PF6e zGgS`cRBX00Vnh&$3kVo#$tQnaQtES+un+k}4`bwRyh+$85NBDR`V?VegaO(?v}IW_ z>!12O9M2F+u;9gXi$5wgJb>FuzRE$XmYd~H$K4{R>h#IBB|JDAU>V4GKOYda=A8Xd zYZ0vDy*1fdor2+>m3Nx3Gfqz_D@Tl4uL9adOU*4>*^}C*WVwrT~i-$QcsS=(%-_ zk(5sSGHbaay>RDvPA+Ru>Zy>_w|oCWHh6(s@Z5J-6m#5T-7OZHcpI-f^)oN9sSSYW`wx{=XBm|EcXZ+_BT-hX_48NLrKoPe1@b zmj6`!(f=5z19as7r65bQbF+y~NI0$PZZOV{e5_sdR~p^rf#s=-&~5cgj<;fd?$zu} zC%4&(muOInX6Dk6Gu~JAJ|ZJL#-u#ZWQ2qnTyyqoW{ldMp8OnLwRfqZLR7C${^EG5 zB+A1x8oXdX7iyR{!rrdDKnJbBv-VTkKS+mua!Wvk{@mM{3Cqll3IiBC3dF~BzK#eS z?HxWE(3vLbwKm@LK5=N+npHr>p{IzJRSj9!T}?gB{#V=gYZ?wHB(LU{OyF8XQvZ3rB#Po=T1K5 zt&zHIs(?RF9Y`i{OU1AXrD=djIX}_KLMaDw+aY@iA7TP#zN09sn220v^2zh2({;Ip zdz*8*rl#qV@sBcw_8S)OiKrp>6~NRRe-^jh=a#hGGGT5sI6!AiZb%F2NbH7XJWZ$nIH0{jkio{>>C*0x_rO(c z;)6ELv{gs{oE-Ch@RWvu?8XtEa^5C5YF z;_|S|EyM=ME;IaE&v}kFqZ6rPbxc5tEd0vh%+KIQ$^g`PC{T7k%^$m){DRmSCPxdS zOX++&56K{|>rQLnQ6GHjLkLZ~#Oi=yKwF!%vx;n$g>8rY%gfmn1@Wd~t7F1pp*S23 z2149fy64v!#?O)YVqF7om?le%rX>DFwa_Jop=${!T`_J%VO(V3el zzvza0+e|!HI=`=x3;!syvYUz+%N+x`!Aiwq;M?iJWL`Sc*0-I|i5&aE{uMc|y!EKyf!}75^$?~_cJm|YIBr!QW8y?ASP#M2 zTn&;07gD;PFDckE1#2s2kmpe>lDtl7@7nKs9N>{`ii-ZYpu^ew`%Bj0>&~pph*rl& zYw1ykc>hZh(x{sDXlf6%qg9hOKV6rv-zxpEsUV^Rf#%`t8$Re~Zc<^E@eMNSGQhf; z(tJir509~Az^zmTQjX(^;|lZkPx{)f7$QT+L^E_Z+~6@`3E7@IYRZd2WY+4%CRexz zK{VbTBm|vNcsdc1F;4Ubv{vDgmSyu58F!3aNdyoh2{z|e4YuD|89gkhY7dm?Iay#T z7v1qQf{vgfiP|QLguHwEes%d&T!|o=_OgUqGod=Vq+ETk z;M0lWF0)~ck`1#&PKaL$6 zuxW_{X~1QqgGk>VM@$e~0fm_-pNUCi-%IrRR&q^|ad~4}0iv%X7Cc~)ukI)yWo~;h zaikQ;Hj_t?L)PFQs1MpflUSci$~?F+96Q2~#?%Et3uGTfeQKuqXKdZw)hRX zwjU+xopgyOJx<1!@KV(49apxgr=KTI%-!u0a-wbuj~UVi?1h!-O7r%F^JA90y369d1 zKW(#$bbrB`h)WxBAF1ES&(!Cw4RE`o=`qGrO{Y_H{*CCXnd9}0GEo||%9vQVQSecKp9sal=rI;+uidpA$dbBRE(8+oz?{pi>K7MRMn5{fkB-duz!u)%L&3=K)nAH%40keMF;3qu)(LE(3 zFQ|Q44V?SE>Efw#-%2mq*NSLhow16L(5htW&FI(b(O;G(c7p~l^Q#H35X}w##W_YM zlKk364CiLnq}QVfAiYy=IQ=!=q9a<=I!r(Ui!dj^6u(g z1Q6+JiiE;V$t)vPV(IPDrczeNBw%=|JaFx3kfTU{B=Zo$ zJq3TX$W)Gqb>v}*?)u@D?nekzV^Fw1QcpMm)u9ESR>z0mTsnap)cvP9OoFEjR&i2c zuJL*y-|aqPI_=Xta`8V5%}}Z}a;Ij|>3IiI84nnVSKo>ySI2-)^Lp6yI^*0=!g{3n zmBo0jle}q2P8?L02W1=Yc3$R;?Pk|SkmbO}%l@m@l0tlL2*z|wj25`TjWwdVt9D{z znXJVog8`>Q=^4uJVjVwbGlHgC9C;L-x|!2gmF65P8s*tH9(QG#Vo_|@6fsH8346oU znS1zJ^<}g)gCWm#933ob-PNXC5s-hcXyL|e2i_awy)U**CYy9b@VMkI%`lVVaGMe0 zpsS3V=Afv=QQrV0Bj{tqTE6|Ue5Xogh4uBqPZuFtlP?;-+v1x2sn3-qB1-1|#o;f& z*F|?;A2mwo>K#s3>SzVwd49OYPiEqoe2}0r&yYHYxN^^sG+JN}#l|N4Rp4(qGA#J% zX*Gt}=j%86zu>lh8=HG_dCK5gX?lXq=u50R{=i^`8Ai*GmE^%uni>#j(|I9QkT1y$ z3-1))GH3ASPlzC3aL$TP;1fii#0lbR+ba$!T%PeO%?M&G!#k!kg6)x3gHP~kfKF72>Ju`|47~Hsh7PH}{bCF~ zd-T%<^V&)oj6b$_#tUQADfe&tiRcbQp>+mehFM5#nTDZV`1hRoNo5cyaZ5GW58JHCqNhB-x9Zr_KXO z7R)$VFIM3YAcIeti6U#;M|J`ZV&-8XQ$ zrexC6Ua^+#0VO~yFZPn{rYx0CEef%O^cbjZhEaNkXalxHQ#Z#KprarXa0=< zr%?F@xOS`e%8Q{kv{dzuS_g0d;@FZ>XY11Tm)mTC7X;t&SOY%W0_m>bpfa#j@__Xy zCiIf$xaON^YSU*+xR$n|CF-fVZYa!ViKvp4wA3~reyZFckY7PPnwW@e-GRaC46I=G zOLeYEuzKHrGgu8h?AQ*0RS*NJKI{x1HWvw`lc~h^`C2{1KxKk45EitdEoICaNN<{U(Le)>0jew62p{y zU;JEGHnL4(v^IA#w*lG{5D<8N|IA0r+<)1{EuZf?+bcjIRg{YJa-%~MA4@ersnLl5 z0Pl=u200A8)i=AoowZmCbQ1rIr`7D7jQ>0(*x&3GAt`k*FJ&FTY<+-jSnRo01h!wF zY_0T~xn&{jF;eqD7s)2R(+Qz`a7%q2Yf4^P$`lX2J>Fk}1`0L&NBHw~8(|D9mlJ^f{5}8+3bn#CIoz z%EkAuVRxC>ppaG%!v{TUg#PWUn){TWNi!SQk>~`;QVLU+=fMTi#r(sFrQZtcsd1f8 z4iE>`3E1cmovFYGwg|qTyVFyYGjI#VO7)fHPtXp;8^+{>g(d(_)xQ@!M`YAl#4QVSoT4cTA=U^kVZLC z&1Gj@s*A-|I>N}w+D4ZSby7^qDSak?DxUy6-J!y>h{)SNf7o69Lj?;Earxi+s)07HEj?U%Wd0hoUu1jR91C z#}Zk7^>7tiARx~p=vd=70A672OUceQP%ln&c3c^$B|67^`a|r-Ac$WP0mVrta94K@ zmRZb@cgB#dZ(ca2bxOL8_vQ+aPm268AhSJ!F^OdsJ3nxCb#-+R*?`?OuysJ${5{x{ zg`Ok|6Hq@5$ntDDC%3evNd^%@cJE&nF)5)e&-bwX(#Z}Rl!VNO>;iY?{LN43Ks+1i*={DL7BslY1Ps18aHvjQIbS(UurN8uZ>_W>duvl~$T2e4zruwz%FXiq~ z;0h8f(j#~0yLk{v)oUk!Toe{I6#(2LQH*@o2t#oE-TogTx0jU5xhrILiLe?BrwQyO?Q;t=Qpc}k;-;S_$zJ^14mQVSPKKs!z zbA%OkJZ$E)p^hK3Q> z1QDj*42umMo5$xst1tL9F4?G+Pp`j8h7keB3@meCOx>{Wa}yj#YNafFrfR1gD*Tuv zorc;u8!KfYC?H6&rqfGNa3b$_XkmLNhqsv-NcnOHd7+e+YxUXUl{k_!{uqg6&aFE`z<%m9_>MPj=F7vfQ2Emh8b(;5L;3mpY%FRxNcM!yZken(JA=G)G|Fk48RR7=hF`4$Iv+jBv7+hQ<78yi0)n z98i$@{PR8%Ug160U03U7TCeB1s{TEDPXC#&QPn=iTp&6z009rZnh?q%JUcATadl?f zv)-yihyixujr_zF;7W<(N8`C?KI*ge+6Ct@Rd>2Mc-62<=1h_NR>sh%wdL6L9T?Z} z$USyR;;4#J?qef-LYt4N9If7cw{$Bkugn9hDyycU>75DG(Fk}xG|=%XtiR^r;9@QP zRpY8GtYR-ZH%IsPf(Gt}gtywOSyz7=?6IYHr%@4$VQEbDcbY1@8dIQ1ct<`Q^r?Me zCc+r(NPezmSR+LNC}bb*;TqQn@iCg@D1QVQz5S?_^6cimit(&=*m{^UuQ#4jK&~I! zUB`YJ@Q7{TL(ug=Ih(^XlaoFmp|ua6h_g5ycoS(m4YBlBu2!J|?LxBr`+16@`rVq! ze1Zy(U+Njp@W%Ljs4H7&C?6hmZ}*KyV{;1DAR9sr6fST@gfri-Z00|I{we+*%lp5hmp)(~^5mrvE17j|}X!9z02`S<~ZvoR>{$Wq5 zEfL~V96=fHl*Sz1vNKn_Ru)D#JjKu!b}!oH6PE4rT>fH34WV$(5@1clTWXihYVVpv z5>Qi19RP?2e5EWJ@TI_|2w%CA6a7bPFA6GN>)h>3<>|LnjrGlSDYL2H9yS$<9mHj4trNEHd7SMRKQe4U!dawrRjyo3A0U}37|)|7 zrxtz7t&jr`A2kvODDLWYVMzTz)Ud&jTkdY?==ws#);%1@6siDePP1w|)5db;D_g)> zMNzf4yQoLq>*V>8i;bw)06zca00D1N>6joX0$N{;AM*#>bolNsK85+wcmy_D3|R#Q znv>p(5NGh=#5XHxSCaXHux-$67vKhy&i61t8q z-vQ!|UsI(3k-sacmyPl*)oZ*m;ZB#pFVlg7dT`JEy8P^w%@VhwimGa(JHFvZJ^p6U zD#GpYs(YE&BGi&kev+J(m?QL8Q<4xD!?>^cu=$`mRgsE0W0BeENtc`+aV4^4Jo({-Ute+Z!FH&P~E?%{mUEVs_)VeYvN8y@s+3AR1F871f>g zxB9A%Q*8p3;1=J{DT_U^l+yX0r}f2Je>KejDi-J5h7H_TUL^0tj(*S(Ux}yH`t>zL zWyt$-TkTSvu^!Gt;HHQMt_e9Dn%LL}fBwL-{ofz4zXyS;e)@p=ILL#|K-kyu5FFps MxvgD(#rDbn0-T6#nE(I) literal 0 HcmV?d00001 diff --git a/storages.js b/storages.js new file mode 100644 index 0000000..3339764 --- /dev/null +++ b/storages.js @@ -0,0 +1,8 @@ +define(function(require) { + return { + "storages": [ + "s3", + "mts" + ] + }; +}); diff --git a/style/app.css b/style/app.css new file mode 100644 index 0000000..2ed82e9 --- /dev/null +++ b/style/app.css @@ -0,0 +1,295 @@ +.storagemgmt-app .storages-settings { + display: block; + background: white; + padding: 13px 23px 2px; + margin-bottom: 24px; + border-radius: 8px; + position: relative; } + .storagemgmt-app .storages-settings .close-btn { + width: 31px; + display: inline-block; + text-align: center; + position: absolute; + top: 10px; + right: 10px; } + .storagemgmt-app .storages-settings .close-btn i.fa { + font-size: 20px; } + .storagemgmt-app .storages-settings .close-btn:hover i.fa { + color: #22A5FF; } + +.storage-manager-wrapper { + padding: 0 0 15px 0; + margin-bottom: 15px; } + .storage-manager-wrapper .buttons-wrapper .dynamic-link { + font-size: 16px; + vertical-align: top; + margin-left: 18px; + line-height: 30px; } + .storage-manager-wrapper .btn { + vertical-align: top; } + .storage-manager-wrapper a.btn .fa { + margin-right: 5px; + vertical-align: -1px; } + .storage-manager-wrapper a.btn:hover .fa { + color: #22A5FF; } + .storage-manager-wrapper .storage-items-list { + margin-bottom: 10px; } + .storage-manager-wrapper h3 { + color: #555; + font-weight: normal; + line-height: 1; + font-size: 22px; + margin: 5px 0 13px; } + .storage-manager-wrapper .empty-storage { + border: 1px dashed #999; + height: 320px; + text-align: center; } + .storage-manager-wrapper .empty-storage button { + margin-top: 25px; } + .storage-manager-wrapper .empty-storage i.main-icon { + margin-top: 60px; + font-size: 72px; } + .storage-manager-wrapper .empty-storage .main-title { + font-size: 18px; + margin-top: 40px; } + .storage-manager-wrapper .empty-storage .sub-title { + color: #909099; + margin-top: 5px; } + .storage-manager-wrapper .storage-choice .logo-header { + display: inline-block; + vertical-align: top; + width: 118px; + height: 40px; + padding-top: 8px; } + .storage-manager-wrapper .storage-choice .logo-header img, + .storage-manager-wrapper .storage-choice .logo-header svg { + display: block; + max-height: 40px; } + .storage-manager-wrapper .storage-choice .item-settings-wrapper { + clear: both; } + .storage-manager-wrapper .storage-provider-wrapper { + opacity: 0.6; + max-width: 596px; + width: 49%; + display: inline-block; + vertical-align: top; + margin: 6px 12px 6px 0; } + .storage-manager-wrapper .storage-provider-wrapper.active-storage, .storage-manager-wrapper .storage-provider-wrapper.new-storage-item, .storage-manager-wrapper .storage-provider-wrapper:hover { + opacity: 1; } + .storage-manager-wrapper .storage-provider-wrapper button { + margin-right: 10px; + font-size: 14px; } + .storage-manager-wrapper .storage-provider-wrapper.active-storage .storage-choice .check-icon-wrapper { + visibility: visible; } + .storage-manager-wrapper .storage-provider-wrapper.active-storage .storage-choice a .check-icon { + color: #22A5FF; + opacity: 1; } + .storage-manager-wrapper .storage-provider-wrapper:hover .storage-choice .check-icon-wrapper { + visibility: visible; + opacity: 0.4; + /*webkit-animation: blinker 2s linear infinite; + animation: blinker 2s linear infinite; */ } + .storage-manager-wrapper .storage-provider-wrapper.active-storage:hover .storage-choice .check-icon-wrapper { + opacity: 1; } + .storage-manager-wrapper .storage-provider-wrapper .storage-choice a:hover .check-icon { + color: #22A5FF; } + .storage-manager-wrapper .storage-provider-wrapper .storage-item-settings > .row-fluid { + border-top: 1px solid #D0D0D9; + padding-top: 18px; } + .storage-manager-wrapper .storage-choice { + background: #FFF; + border: 1px solid #D0D0D9; + border-radius: 2px; + line-height: 46px; + padding: 7px 25px 7px; } + .storage-manager-wrapper .storage-choice::after { + content: ''; + display: block; + clear: both; } + .storage-manager-wrapper .storage-choice .check-icon-wrapper { + width: 22px; + display: inline-block; + vertical-align: 5px; + margin-right: 15px; + visibility: hidden; } + .storage-manager-wrapper .storage-choice .check-icon { + font-size: 25px; } + .storage-manager-wrapper .storage-choice .right-section { + float: right; + line-height: 25px; + padding-top: 13px; + z-index: 10; + position: relative; } + .storage-manager-wrapper .storage-choice .right-section a { + margin-left: 11px; + vertical-align: top; + display: inline-block; } + .storage-manager-wrapper .storage-choice .right-section a.remove-storage-link { + position: relative; + top: -2px; } + .storage-manager-wrapper .storage-choice .right-section a:hover .fa { + color: #22A5FF; } + .storage-manager-wrapper .storage-choice .right-section a:hover .fa { + color: #22A5FF; } + .storage-manager-wrapper .storage-choice .storage-manager-wrapper .active-storage .select-storage-link:hover .fa { + cursor: default; + /*color: #555;*/ } + .storage-manager-wrapper .storage-choice .right-section a.remove-storage-link:hover .fa { + color: #ff0009; } + .storage-manager-wrapper .storage-choice a .fa { + font-size: 25px; + vertical-align: middle; } + .storage-manager-wrapper .storage-choice .edit-storage-link:hover { + color: #22A5FF; } + .storage-manager-wrapper .storage-choice .storage-name { + font-weight: 600; + text-align: left; + display: inline-block; + vertical-align: top; + margin-top: 0; + width: 160px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; } + .storage-manager-wrapper .storage-choice .folder-icon { + color: #D0D0D9; + font-size: 20px; + margin-right: 10px; + vertical-align: middle; } + .storage-manager-wrapper .storage-choice .edit-path { + color: #505059; + cursor: pointer; + font-size: 20px; + margin-left: 10px; + vertical-align: middle; } + .storage-manager-wrapper .storage-choice #path { + margin: 0 5px; } + .storage-manager-wrapper .storage-choice .custom-path { + display: inline-block; } + +.storage-item-settings .storage-item-logo { + text-align: center; } + .storage-item-settings .storage-item-logo img, .storage-item-settings .storage-item-logo svg { + max-height: 40px; } + +.storage-item-settings .form-horizontal { + margin: 0 auto; + display: block; + max-width: 410px; } + .storage-item-settings .form-horizontal .control-label { + width: 110px; + display: inline-block; + vertical-align: top; + float: none; + padding-right: 14px; } + .storage-item-settings .form-horizontal .controls { + margin-left: 0; + display: inline-block; + vertical-align: top; } + +.storage-item-settings input[type="text"], +.storage-item-settings input[type="password"] { + border-right: 1px solid #F5F5F5; + border-bottom: 1px solid #F5F5F5; + font-size: 14px; } + +.storage-item-settings .buttons-wrapper { + text-align: center; } + +.storage-item-settings .ui-tabs { + border: none; + background: none; + padding: 0; } + .storage-item-settings .ui-tabs .ui-tabs-nav { + background: none; + border: none; + padding: 0; } + .storage-item-settings .ui-tabs .ui-tabs-nav li { + border: 0; + border-radius: 0; + background: #9B9B9B; + margin: 0; + width: 50%; } + .storage-item-settings .ui-tabs .ui-tabs-nav li.ui-tabs-active, .storage-item-settings .ui-tabs .ui-tabs-nav li.ui-tabs-active.ui-state-hover { + border: none; + border-radius: 0; + margin: 0; + background: white; } + .storage-item-settings .ui-tabs .ui-tabs-nav li.ui-state-hover { + background: #CDCDCD; + border: none; } + .storage-item-settings .ui-tabs .ui-tabs-nav li a { + width: 100%; + box-sizing: border-box; } + .storage-item-settings .ui-tabs .ui-tabs-panel { + padding-bottom: 0; } + +.new-storage-item.flash-effect > .storage-choice { + animation-name: flash_border; + animation-duration: 2s; + animation-timing-function: linear; + animation-iteration-count: 2; } + +.new-storage-item .storage-choice { + padding: 0; } + +.new-storage-item .storage-item-settings { + padding: 0; } + +.new-storage-item .logo-header { + display: block; + margin: 0 auto; } + +.new-storage-item .tab-content { + background: none; + border: none; } + +.icon-loader { + width: 24px; + height: 24px; + display: inline-block; + vertical-align: top; + background: url("data:image/png;base64,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"); } + +.storage-message { + padding: 10px; + border: none; + max-width: 596px; + width: 49%; + min-width: 250px; + margin-bottom: 10px; + font-size: 16px; + line-height: 1.2; + background: white; + color: black; + box-sizing: border-box; } + +.storage-msg-warning { + background-color: #ff4200; } + +.storage-msg-info { + background-color: #22A5FF; } + +.storage-msg-success { + background-color: #00cc2e; } + +.dynamic-link:hover { + border-bottom: 1px dashed; } + +@media (max-width: 1000px) { + .storage-manager-wrapper .storage-provider-wrapper { + width: 100%; } } + +/* ---------------------------- + Animations ---------------*/ +@keyframes blinker { + 50% { + opacity: 0; } } + +@keyframes flash_border { + 0% { + border-color: #22A5FF; } + 50% { + border-color: #D0D0D9; } + 100% { + border-color: #22A5FF; } } diff --git a/style/app.scss b/style/app.scss new file mode 100644 index 0000000..b002de5 --- /dev/null +++ b/style/app.scss @@ -0,0 +1,442 @@ +.storagemgmt-app { + .storages-settings { + display: block; + background: white; + padding: 13px 23px 2px; + margin-bottom: 24px; + border-radius: 8px; + position: relative; + + .close-btn { + width: 31px; + display: inline-block; + text-align: center; + position: absolute; + top: 10px; + right: 10px; + } + + .close-btn { + i.fa { + font-size: 20px + } + + &:hover i.fa { + color: #22A5FF; + } + + } + } +} + + +.storage-manager-wrapper { + padding: 0 0 15px 0; + margin-bottom: 15px; + + .buttons-wrapper .dynamic-link { + font-size: 16px; + vertical-align: top; + margin-left: 18px; + line-height: 30px; + } + + .btn { + vertical-align: top; + } + + a.btn .fa { + margin-right: 5px; + vertical-align: -1px; + } + + a.btn:hover .fa { + color: #22A5FF; + } + + .storage-items-list { + margin-bottom: 10px; + } + + h3 { + color: #555; + font-weight: normal; + line-height: 1; + font-size: 22px; + margin: 5px 0 13px; + } + + .empty-storage { + border: 1px dashed #999; + height: 320px; + text-align: center; + } + + .empty-storage button { + margin-top: 25px; + } + + .empty-storage i.main-icon { + margin-top: 60px; + font-size: 72px; + } + + .empty-storage .main-title { + font-size: 18px; + margin-top: 40px; + } + + .empty-storage .sub-title { + color: #909099; + margin-top: 5px; + } + + .storage-choice .logo-header { + display: inline-block; + vertical-align: top; + width: 118px; + height: 40px; + padding-top: 8px; + + img, + svg { + display: block; + max-height: 40px; + } + } + + .storage-choice .item-settings-wrapper { + clear: both; + } + + .storage-provider-wrapper { + opacity: 0.6; + max-width: 596px; + width: 49%; + display: inline-block; + vertical-align: top; + margin: 6px 12px 6px 0; + + &.active-storage, + &.new-storage-item, + &:hover { + opacity: 1; + } + + button { + margin-right: 10px; + font-size: 14px; + } + + &.active-storage .storage-choice { + .check-icon-wrapper { + visibility: visible; + } + + a .check-icon { + color: #22A5FF; + opacity: 1; + } + } + + &:hover .storage-choice .check-icon-wrapper { + visibility: visible; + opacity: 0.4; + /*webkit-animation: blinker 2s linear infinite; + animation: blinker 2s linear infinite; */ + } + + &.active-storage:hover .storage-choice .check-icon-wrapper { + opacity: 1; + } + + .storage-choice a:hover .check-icon { + color: #22A5FF; + } + + .storage-item-settings >.row-fluid { + border-top: 1px solid #D0D0D9; + padding-top: 18px; + } + } + + .storage-choice { + background: #FFF; + border: 1px solid #D0D0D9; + border-radius: 2px; + line-height: 46px; + padding: 7px 25px 7px; + + &::after { + content: ''; + display: block; + clear: both; + } + + .check-icon-wrapper { + width: 22px; + display: inline-block; + vertical-align: 5px; + margin-right: 15px; + visibility: hidden; + } + + .check-icon { + font-size: 25px; + } + + + .right-section { + float: right; + line-height: 25px; + padding-top: 13px; + z-index: 10; + position: relative; + } + + .right-section a { + margin-left: 11px; + vertical-align: top; + display: inline-block; + } + + .right-section a.remove-storage-link { + position: relative; + top: -2px; + } + + .right-section a:hover .fa { + color: #22A5FF; + } + + .right-section a:hover .fa { + color: #22A5FF; + } + + .storage-manager-wrapper .active-storage .select-storage-link:hover .fa { + cursor: default; + /*color: #555;*/ + } + + .right-section a.remove-storage-link:hover .fa { + color: #ff0009; + } + + a .fa { + font-size: 25px; + vertical-align: middle; + } + + .edit-storage-link:hover { + color: #22A5FF; + } + + .storage-name { + font-weight: 600; + text-align: left; + display: inline-block; + vertical-align: top; + margin-top: 0; + width: 160px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + + .folder-icon { + color: #D0D0D9; + font-size: 20px; + margin-right: 10px; + vertical-align: middle; + } + + .edit-path { + color: #505059; + cursor: pointer; + font-size: 20px; + margin-left: 10px; + vertical-align: middle; + } + + #path { + margin: 0 5px; + } + + .custom-path { + display: inline-block; + } + } +} + +.storage-item-settings { + .storage-item-logo { + text-align: center; + + img, svg { + max-height: 40px; + } + } + + .form-horizontal { + margin: 0 auto; + display: block; + max-width: 410px; + + .control-label { + width: 110px; + display: inline-block; + vertical-align: top; + float: none; + padding-right: 14px; + } + + .controls { + margin-left: 0; + display: inline-block; + vertical-align: top; + } + } + + input[type="text"], + input[type="password"] { + border-right: 1px solid #F5F5F5; + border-bottom: 1px solid #F5F5F5; + font-size: 14px; + } + + .buttons-wrapper { + text-align: center; + } + + .ui-tabs { + border: none; + background: none; + padding: 0; + + .ui-tabs-nav { + background: none; + border: none; + padding: 0; + + li { + border: 0; + border-radius: 0; + background: #9B9B9B; + margin: 0; + width: 50%; + + &.ui-tabs-active, + &.ui-tabs-active.ui-state-hover { + border: none; + border-radius: 0; + margin: 0; + background: white; + } + + &.ui-state-hover { + background: #CDCDCD; + border: none; + } + + a { + width: 100%; + box-sizing: border-box; + } + } + } + + .ui-tabs-panel { + padding-bottom: 0; + } + } +} + +.new-storage-item { + &.flash-effect > .storage-choice { + animation-name: flash_border; + animation-duration: 2s; + animation-timing-function: linear; + animation-iteration-count: 2; + } + + .storage-choice { + padding: 0; + } + + .storage-item-settings { + padding: 0; + } + + .logo-header { + display: block; + margin: 0 auto; + } + + .tab-content { + background: none; + border: none; + } +} + +.icon-loader { + width: 24px; + height: 24px; + display: inline-block; + vertical-align: top; + background: url('data:image/png;base64,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'); +} + +.storage-message { + padding: 10px; + border: none; + max-width: 596px; + width: 49%; + min-width: 250px; + margin-bottom: 10px; + font-size: 16px; + line-height: 1.2; + background: white; + color: black; + box-sizing: border-box; +} + +.storage-msg-warning { + background-color: #ff4200; +} + +.storage-msg-info { + background-color: #22A5FF; +} + +.storage-msg-success { + background-color: #00cc2e; +} + +.dynamic-link:hover { + border-bottom: 1px dashed; +} + +@media (max-width: 1000px) { + .storage-manager-wrapper .storage-provider-wrapper { + width: 100%; + } +} + +/* ---------------------------- + Animations ---------------*/ + +@keyframes blinker { + 50% { opacity: 0; } +} + +@keyframes flash_border { + 0% { + border-color: #22A5FF; + } + 50% { + border-color: #D0D0D9; + } + 100% { + border-color: #22A5FF; + } +} diff --git a/style/static/images/mts.svg b/style/static/images/mts.svg new file mode 100644 index 0000000..3a0b7f3 --- /dev/null +++ b/style/static/images/mts.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/submodules/mts/i18n/en-US.json b/submodules/mts/i18n/en-US.json new file mode 100644 index 0000000..658c9a4 --- /dev/null +++ b/submodules/mts/i18n/en-US.json @@ -0,0 +1,12 @@ +{ + "storagemgmt": { + "submodules": { + "mts": { + "nameLabel": "Name", + "bucketLabel": "Bucket", + "keyLabel": "Key", + "secretLabel": "Secret" + } + } + } +} diff --git a/submodules/mts/img/logo.png b/submodules/mts/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2f2ea43061d86f4f44944350ec469a55501a59 GIT binary patch literal 18286 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 + + + + + diff --git a/submodules/mts/views/logo.html b/submodules/mts/views/logo.html new file mode 100644 index 0000000..3e196af --- /dev/null +++ b/submodules/mts/views/logo.html @@ -0,0 +1 @@ +mts diff --git a/submodules/s3/i18n/en-US.json b/submodules/s3/i18n/en-US.json new file mode 100644 index 0000000..0c0bad4 --- /dev/null +++ b/submodules/s3/i18n/en-US.json @@ -0,0 +1,12 @@ +{ + "storagemgmt": { + "submodules": { + "s3": { + "nameLabel": "Name", + "bucketLabel": "Bucket", + "keyLabel": "Key", + "secretLabel": "Secret" + } + } + } +} diff --git a/submodules/s3/img/logo.png b/submodules/s3/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2e25ac5d8c358c5eb9820997c55cadf2fb43375b GIT binary patch literal 5526 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 + + + + diff --git a/submodules/s3/views/logo.html b/submodules/s3/views/logo.html new file mode 100644 index 0000000..e3dc5f7 --- /dev/null +++ b/submodules/s3/views/logo.html @@ -0,0 +1 @@ +s3 diff --git a/views/field-path.html b/views/field-path.html new file mode 100644 index 0000000..08becf5 --- /dev/null +++ b/views/field-path.html @@ -0,0 +1,5 @@ +
+ + + {{ i18n.cancel }} +
diff --git a/views/item-settings.html b/views/item-settings.html new file mode 100644 index 0000000..feccf10 --- /dev/null +++ b/views/item-settings.html @@ -0,0 +1,17 @@ +
+
+
+
+ {{{ formElements }}} +
+ + +
+
+
+
+
diff --git a/views/layout.html b/views/layout.html new file mode 100644 index 0000000..9043438 --- /dev/null +++ b/views/layout.html @@ -0,0 +1,32 @@ +
+

{{ @root.i18n.storagemgmt.settingsTitle }}

+
+ {{#compare storages.length ">" 0}} + {{#each storages}} +
+
+ + + +
+ {{{ logo }}} +
+ {{ name }} +
+ + +
+
+
+
+ {{/each}} + {{/compare}} +
+
+ +
diff --git a/views/new-item.html b/views/new-item.html new file mode 100644 index 0000000..06e65e2 --- /dev/null +++ b/views/new-item.html @@ -0,0 +1,44 @@ +
+
+
+
+ {{#if storages.length}} + +
+ {{#each storages}} +
+
+ {{{ formElements }}} + +
+ + +
+
+
+ {{/each}} +
+ {{/if}} +
+
+
+
+ +