@c8y/ng1-modules 1021.6.0 → 1021.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- (()=>{function e(r){var t,o=this,e=r.Types,n=r.Validations;function a(e){return!!_.includes(o.schemaPropertyType.validations,e)}function p(p){return _.reduce(n.values(),function(e,r){var t=a(r),o=!_.isUndefined(p.schema[r.value]);return e[r.value]=t&&o,e},{})}_.assign(o,{Types:e,Validations:n,isValidationSupported:a,$onChanges:function(e){e._property&&(o.property=_.cloneDeep(o._property),o.schemaPropertyType=r.getType(o.property),o.validationsApplied=p(o.property))},$doCheck:function(){var e=(()=>{var t={key:o.property.key,schema:o.property.schema};return _.forEach(o.validationsApplied,function(e,r){e||"required"===r||_.unset(t,["schema",r])}),t})();(e=>{var r=!_.isEqual(e,t);return t=_.cloneDeep(e),r})(e)&&o.onChange({property:e,originalProperty:o._property})},setType:function(){r.setType(o.property,o.schemaPropertyType),o.validationsApplied=p(o.property)}})}e.$inject=["SchemaPropertiesSvc"],angular.module("c8y.ui").component("c8ySchemaPropertyEditor",{bindings:{_property:"<property",onChange:"&"},templateUrl:":::PLUGIN_PATH:::/ui/schemaForm/schemaPropertyEditor.html",controller:e,controllerAs:"vm"})})();
1
+ (()=>{function e(r){var t,p=this,e=r.Types,n=r.Validations;function i(e){return!!_.includes(p.schemaPropertyType.validations,e)}function o(o){return _.reduce(n.values(),function(e,r){var t=i(r),p=!_.isUndefined(o.schema[r.value]);return e[r.value]=t&&p,e},{})}_.assign(p,{Types:e,Validations:n,isValidationSupported:i,$onChanges:function(e){e._property&&(p.property=_.cloneDeep(p._property),p.schemaPropertyType=r.getType(p.property),p.validationsApplied=o(p.property))},$doCheck:function(){var e=(()=>{var t={key:p.property.key,schema:p.property.schema};return _.forEach(p.validationsApplied,function(e,r){e||"required"===r||_.unset(t,["schema",r])}),t})();(e=>{var r=!_.isEqual(e,t);return t=_.cloneDeep(e),r})(e)&&p.onChange({property:e,originalProperty:p._property})},setType:function(){r.setType(p.property,p.schemaPropertyType),p.validationsApplied=o(p.property)},updateRequiredValidationApplied:function(){p.property.schema.required||_.unset(p.property.schema,"required")}})}e.$inject=["SchemaPropertiesSvc"],angular.module("c8y.ui").component("c8ySchemaPropertyEditor",{bindings:{_property:"<property",onChange:"&"},templateUrl:":::PLUGIN_PATH:::/ui/schemaForm/schemaPropertyEditor.html",controller:e,controllerAs:"vm"})})();
@@ -72,6 +72,7 @@
72
72
  <input
73
73
  type="checkbox"
74
74
  ng-model="vm.property.schema.required"
75
+ ng-change="vm.updateRequiredValidationApplied()"
75
76
  ng-disabled="!vm.isValidationSupported(vm.Validations.REQUIRED)"
76
77
  />
77
78
  <span></span>
@@ -1 +1 @@
1
- angular.module("c8y.cockpit.dataPointExplorer").controller("DataPointWidgetConfigCtrl",["$scope","c8yDataPointSvc","gettext",function(a,n,t){a.noActions=!0,a.dontSave=!0,a.onRealtimeAlarmFn=function(t){a.onAlarm=t},a.onRealtimeEventFn=function(t){a.onEvent=t},a.dateSelectionHelpPopoverText=t('\n Choose how to select a date range, the available options are:\n <ul class="m-l-0 p-l-8 m-t-8 m-b-0">\n <li><b>Widget configuration:</b> restricts the date selection only to the widget configuration</li>\n <li><b>Widget and widget configuration:</b> restricts the date selection to the widget view and widget configuration only</li>\n <li><b>Dashboard time range:</b> restricts date selection to the global dashboard configuration only</li>\n </ul>\n ');function e(t,a){var a=_.pick(a,"dateFrom","dateTo","aggregation","displayDateSelection","interval","realtime","displayDateSelection","widgetInstanceGlobalTimeContext","canDecoupleGlobalTimeContext"),e=n.getDefaultFilters();_.assign(t,e,a)}a.onBoxChanged=function(t){a.chartBox=t},a.data={},a.data.datapoints=_.cloneDeep(a.config.datapoints),a.data.alarmsEventsConfigs=_.cloneDeep(a.config.alarmsEventsConfigs),e(a.data,a.config),a.dateSelection=(()=>{var t=a.data.widgetInstanceGlobalTimeContext?"dashboard_context":a.data.displayDateSelection?"view_and_config":"config";return t})(),a.$watch("dateSelection",function(){switch(a.dateSelection){case"dashboard_context":a.data.widgetInstanceGlobalTimeContext=!0;break;case"view_and_config":a.data.widgetInstanceGlobalTimeContext=!1,a.data.displayDateSelection=!0;break;default:a.data.widgetInstanceGlobalTimeContext=!1,a.data.displayDateSelection=!1}},!0),a.$watch("data",function(){a.data.widgetInstanceGlobalTimeContext&&(a.data.dateFrom=a.config.date?a.config.date[0]:a.data.dateFrom,a.data.dateTo=a.config.date?a.config.date[1]:a.data.dateTo,a.data.realtime=a.config.realtime,a.data.displayDateSelection=!1,a.data.canDecoupleGlobalTimeContext=!1,a.data.interval=null),e(a.config,a.data),a.config.datapoints=a.data.graphDataPoints,a.config.alarmsEventsConfigs=a.data.graphAlarmsEventsConfigs},!0)}]);
1
+ angular.module("c8y.cockpit.dataPointExplorer").controller("DataPointWidgetConfigCtrl",["$scope","c8yDataPointSvc","gettext",function(a,n,t){a.noActions=!0,a.dontSave=!0,a.onRealtimeAlarmFn=function(t){a.onAlarm=t},a.onRealtimeEventFn=function(t){a.onEvent=t},a.dateSelectionHelpPopoverText=t('\n Choose how to select a date range, the available options are:\n <ul class="m-l-0 p-l-8 m-t-8 m-b-0">\n <li><b>Dashboard time range:</b> restricts date selection to the global dashboard configuration only</li>\n <li><b>Widget configuration:</b> restricts the date selection only to the widget configuration</li>\n <li><b>Widget and widget configuration:</b> restricts the date selection to the widget view and widget configuration only</li>\n </ul>\n ');function e(t,a){var a=_.pick(a,"dateFrom","dateTo","aggregation","displayDateSelection","interval","realtime","displayDateSelection","widgetInstanceGlobalTimeContext","canDecoupleGlobalTimeContext"),e=n.getDefaultFilters();_.assign(t,e,a)}a.onBoxChanged=function(t){a.chartBox=t},a.data={},a.data.datapoints=_.cloneDeep(a.config.datapoints),a.data.alarmsEventsConfigs=_.cloneDeep(a.config.alarmsEventsConfigs),e(a.data,a.config),a.dateSelection=(()=>{var t=!Object.hasOwn(a.data,"widgetInstanceGlobalTimeContext")&&!Object.hasOwn(a.data,"displayDateSelection")||a.data.widgetInstanceGlobalTimeContext?"dashboard_context":a.data.displayDateSelection?"view_and_config":"config";return t})(),a.$watch("dateSelection",function(){switch(a.dateSelection){case"dashboard_context":a.data.widgetInstanceGlobalTimeContext=!0;break;case"view_and_config":a.data.widgetInstanceGlobalTimeContext=!1,a.data.displayDateSelection=!0;break;default:a.data.widgetInstanceGlobalTimeContext=!1,a.data.displayDateSelection=!1}},!0),a.$watch("data",function(){a.data.widgetInstanceGlobalTimeContext&&(a.data.dateFrom=a.config.date?a.config.date[0]:a.data.dateFrom,a.data.dateTo=a.config.date?a.config.date[1]:a.data.dateTo,a.data.realtime=a.config.realtime,a.data.displayDateSelection=!1,a.data.canDecoupleGlobalTimeContext=!1,a.data.interval=null),e(a.config,a.data),a.config.datapoints=a.data.graphDataPoints,a.config.alarmsEventsConfigs=a.data.graphAlarmsEventsConfigs},!0)}]);
@@ -27,6 +27,12 @@
27
27
  aria-label="{{ 'Date selection' | translate }}"
28
28
  ng-model="dateSelection"
29
29
  >
30
+ <option
31
+ title="{{ 'Dashboard time range' | translate }}"
32
+ value="{{ 'dashboard_context' }}"
33
+ >
34
+ {{ 'Dashboard time range' | translate }}
35
+ </option>
30
36
  <option
31
37
  title="{{ 'Widget configuration' | translate }}"
32
38
  value="{{ 'config' }}"
@@ -39,12 +45,6 @@
39
45
  >
40
46
  {{ 'Widget and widget configuration' | translate }}
41
47
  </option>
42
- <option
43
- title="{{ 'Dashboard time range' | translate }}"
44
- value="{{ 'dashboard_context' }}"
45
- >
46
- {{ 'Dashboard time range' | translate }}
47
- </option>
48
48
  </select>
49
49
  </div>
50
50
  </div>
@@ -1 +1 @@
1
- (()=>{function e(e){this.dateSelectionHelpPopoverText=e('\n Choose how to select a date range, the available options are:\n <ul class="m-l-0 p-l-8 m-t-8 m-b-0">\n <li><b>Widget:</b> restricts the date selection to the widget view only</li>\n <li><b>Dashboard time range:</b> restricts date selection to the global dashboard configuration only</li>\n </ul>\n ')}e.$inject=["gettext"],angular.module("c8y.eventList").controller("EventListConfigCtrl",e)})();
1
+ (()=>{function e(e,t){!!e.config.displaySettings&&"true"!==e.config.widgetInstanceGlobalTimeContext||(e.config.widgetInstanceGlobalTimeContext=!0),this.dateSelectionHelpPopoverText=t('\n Choose how to select a date range, the available options are:\n <ul class="m-l-0 p-l-8 m-t-8 m-b-0">\n <li><b>Dashboard time range:</b> restricts date selection to the global dashboard configuration only</li>\n <li><b>Widget:</b> restricts the date selection to the widget view only</li>\n </ul>\n ')}e.$inject=["$scope","gettext"],angular.module("c8y.eventList").controller("EventListConfigCtrl",["$scope","gettext",e])})();
@@ -20,12 +20,12 @@
20
20
  aria-label="{{ 'Date selection' | translate }}"
21
21
  ng-model="config.widgetInstanceGlobalTimeContext"
22
22
  >
23
- <option title="{{ 'Widget' | translate }}" value="{{ undefined }}">
24
- {{ 'Widget' | translate }}
25
- </option>
26
- <option title="{{ 'Dashboard time range' | translate }}" value="{{ true }}">
23
+ <option title="{{ 'Dashboard time range' | translate }}" ng-value="true">
27
24
  {{ 'Dashboard time range' | translate }}
28
25
  </option>
26
+ <option title="{{ 'Widget' | translate }}" ng-value="undefined">
27
+ {{ 'Widget' | translate }}
28
+ </option>
29
29
  </select>
30
30
  </div>
31
31
  </div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c8y/ng1-modules",
3
- "version": "1021.6.0",
3
+ "version": "1021.11.1",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Cumulocity",
6
6
  "description": "AngularJS modules for Cumulocity IoT applications.",
@@ -1 +1 @@
1
- (()=>{function t(t,n){var i=this,e=t.tenantId,s={},t=_.memoize(function(t){t=o(t.id);return _.get(t,"instances")},function(t){return t.id}),a=null;function c(t){_.forEach(t,function(t){var n=t.applicationId;n&&(s[n]=t)})}function o(t){t=_.get(s,t);return n.getApplicationStatusForTenant(t,e)}_.assign(i,{$onInit:function(){var t={tenantId:e,filters:{pageSize:2e3}};n.getApplicationMOs(t).then(c)},openItem:function(t){(a=a!==t?t:null)&&(t=>{(t=o(t))?i.instancesStatus=n.getInstanceCounts(_.get(t,"details")):i.instancesStatus={}})(t.id)},isOpen:function(t){return a===t},hasApplicationStatus:function(t){t=o(t.id);return!_.isEmpty(t)},memoizedGetSubscriptionInstances:t,instancesStatus:{},getStatusIcon:function(t){t=_.find(n.status.values(),{value:_.get(o(t),"status")});return _.get(t,"icon")},getStringTooltip:function(t){t=_.find(n.status.values(),{value:_.get(o(t),"status")});return _.get(t,"label")}})}t.$inject=["$routeParams","c8yApplication"],angular.module("c8y.tenantApplications").component("c8ySubscribedApplications",{bindings:{associatedApplications:"<",dissociate:"<"},templateUrl:":::PLUGIN_PATH:::/subscribed-applications/subscribed-applications.html",controller:t,controllerAs:"vm"})})();
1
+ (()=>{function t(t,n){var i=this,e=t.tenantId,a={},t=_.memoize(function(t){t=o(t.id);return _.get(t,"instances")},function(t){return t.id}),s=null;function c(t){_.forEach(t,function(t){var n=t.applicationId;n&&(a[n]=t)})}function o(t){t=_.get(a,t);return n.getApplicationStatusForTenant(t,e)}_.assign(i,{$onInit:function(){var t={tenantId:e,filters:{pageSize:2e3}};n.getApplicationMOs(t).then(c)},openItem:function(t){(s=s!==t?t:null)&&(t=>{(t=o(t))?i.instancesStatus=n.getInstanceCounts(_.get(t,"details")):i.instancesStatus={}})(t.id)},isOpen:function(t){return s===t},hasApplicationStatus:function(t){t=o(t.id);return!_.isEmpty(t)},memoizedGetSubscriptionInstances:t,instancesStatus:{},getStatusIcon:function(t){t=_.find(n.status.values(),{value:_.get(o(t),"status")});return _.get(t,"icon")},getStringTooltip:function(t){t=_.find(n.status.values(),{value:_.get(o(t),"status")});return _.get(t,"label")}})}t.$inject=["$routeParams","c8yApplication"],angular.module("c8y.tenantApplications").component("c8ySubscribedApplications",{bindings:{associatedApplications:"<",dissociate:"<",tenant:"<"},templateUrl:":::PLUGIN_PATH:::/subscribed-applications/subscribed-applications.html",controller:t,controllerAs:"vm"})})();
@@ -1,3 +1,5 @@
1
+ <c8y-ui-title-set title="vm.tenant.company"></c8y-ui-title-set>
2
+
1
3
  <div class="card-header sticky-top separator large-padding">
2
4
  <div class="card-title" translate>Subscribed applications</div>
3
5
  </div>
@@ -13,6 +13,7 @@
13
13
  <div class="card d-grid content-fullpage grid__col--6-6--md">
14
14
  <c8y-subscribed-applications
15
15
  dissociate="dissociate"
16
+ tenant="tenant"
16
17
  class="inner-scroll bg-level-0"
17
18
  associated-applications="associatedApplications"
18
19
  ></c8y-subscribed-applications>
@@ -1 +1 @@
1
- (()=>{function e(i,e,t,s,a,n,r,o,c){var u=this,h=t.tenantId,l=n.another(n.paths.Tenants,{tenantId:h}),g="c8ySchema!!customProperties",m={notitle:!0};_.assign(u,{schema:{},form:[],cancel:function(){e.path("tenants")},save:function(e){return a.save(_.pick(u.tenant,["id","applications","customProperties"])).then(function(){o.success(c("Custom properties saved.")),e.$setPristine()})}}),i.all({rootProperty:l.list().then(function(e){return _.filter(e,{id:g})}),isGainsightKeyDefined:_.get(window,"C8Y_APP.gainsightKey")?i.resolve(!!window.C8Y_APP.gainsightKey):r.detailValue({category:"configuration",key:"system.gainsight.api.key"}).then(function(e){return!!e})}).then(function(e){var t=e.rootProperty,n=e.isGainsightKeyDefined;return e=t,i.all({schema:l.getSchema(e),form:l.getForm(e,m),tenant:a.detail(h).then(s.getResData)}).then(function(e){return{results:e,isGainsightKeyDefined:n}})}).then(function(e){var t=e.results;u.schema=e.isGainsightKeyDefined?t.schema:(e=>(e=_.cloneDeep(e),_.unset(e,"properties.customProperties.properties.gainsightEnabled"),e))(t.schema),u.form=t.form,u.tenant=t.tenant})}e.$inject=["$q","$location","$routeParams","c8yBase","c8yTenant","c8yPropertiesLibrary","c8ySettings","c8yAlert","gettext"],angular.module("c8y.tenants").controller("tenantCustomPropertiesCtrl",e)})();
1
+ (()=>{function e(n,e,t,r,s,i,a,o,c){var u=this,p=t.tenantId,l=i.another(i.paths.Tenants,{tenantId:p}),m="c8ySchema!!customProperties",h={notitle:!0};_.assign(u,{schema:{},form:[],cancel:function(){e.path("tenants")},save:function(e){return s.save(_.pick(u.tenant,["id","applications","customProperties"])).then(function(){o.success(c("Custom properties saved.")),e.$setPristine()})}}),u.loaded=!1,n.all({rootProperty:l.list().then(function(e){return _.filter(e,{id:m})}),isGainsightKeyDefined:_.get(window,"C8Y_APP.gainsightKey")?n.resolve(!!window.C8Y_APP.gainsightKey):a.detailValue({category:"configuration",key:"system.gainsight.api.key"}).then(function(e){return!!e})}).then(function(e){var t=e.rootProperty,i=e.isGainsightKeyDefined;return e=t,n.all({schema:l.getSchema(e),form:l.getForm(e,h),tenant:s.detail(p).then(r.getResData)}).then(function(e){return e.schema.properties.customProperties.properties=_.omit(e.schema.properties.customProperties.properties,["externalReference","limit.devices.number","limit.http.requests","limit.http.queue","limit.stream.requests","limit.stream.queue","cepServer.queue.limit","data-broker.queue.limit","gainsightEnabled"]),e}).then(function(e){return{results:e,isGainsightKeyDefined:i}})}).then(function(e){var t=e.results;u.schema=e.isGainsightKeyDefined?t.schema:(e=>(e=_.cloneDeep(e),_.unset(e,"properties.customProperties.properties.gainsightEnabled"),e))(t.schema),u.form=t.form,u.tenant=t.tenant,u.hasCustomProperties=0<Object.keys(u.schema.properties.customProperties.properties).length}).finally(function(){u.loaded=!0})}e.$inject=["$q","$location","$routeParams","c8yBase","c8yTenant","c8yPropertiesLibrary","c8ySettings","c8yAlert","gettext"],angular.module("c8y.tenants").controller("tenantCustomPropertiesCtrl",e)})();
package/tenants/index.js CHANGED
@@ -1 +1 @@
1
- (()=>{function t(t,e,n,r){r.when("/tenants/new",{templateUrl:":::PLUGIN_PATH:::/views/detail.html",controller:"tenantDetailCtrl"}),t.when("/tenants/:tenantId",{templateUrl:":::PLUGIN_PATH:::/views/detail.html",controller:"tenantDetailCtrl",icon:"new-property",name:n("Properties"),priority:4e3}),t.when("/tenants/:tenantId",{templateUrl:":::PLUGIN_PATH:::/views/customProperties.html",controller:"tenantCustomPropertiesCtrl as vm",icon:"property-script",name:n("Custom properties"),priority:3e3,showIf:["$routeParams",function(t){return _.get(t,"tenantId")}]}),e.addTitle("/tenants/:tenantId",{data:["$routeParams","c8yTenant",function(t,e){t=t.tenantId;return t?e.detail(t).then(function(t){return{title:t.data.company}}):{title:n("New tenant")}}]})}t.$inject=["c8yViewsProvider","c8yTitleProvider","gettext","$routeProvider"],angular.module("c8y.tenants",[]).config(t)})();
1
+ (()=>{function e(e,t,n,r){r.when("/tenants/new",{templateUrl:":::PLUGIN_PATH:::/views/detail.html",controller:"tenantDetailCtrl"}),e.when("/tenants/:tenantId",{templateUrl:":::PLUGIN_PATH:::/views/detail.html",controller:"tenantDetailCtrl",icon:"new-property",name:n("Properties"),priority:4e3})}e.$inject=["c8yViewsProvider","c8yTitleProvider","gettext","$routeProvider"],angular.module("c8y.tenants",[]).config(e)})();
@@ -1,54 +1,65 @@
1
- <c8y-breadcrumbs-set>
2
- <c8y-breadcrumbs-item
3
- path="#tenants"
4
- label="{{ 'Subtenants' | translate }}"
5
- icon="c8y-sub-tenants"
6
- ></c8y-breadcrumbs-item>
7
- <c8y-breadcrumbs-item
8
- label="{{ 'Tenants' | translate }}"
9
- icon="c8y-sub-tenants"
10
- ></c8y-breadcrumbs-item>
11
- </c8y-breadcrumbs-set>
12
-
13
- <form name="tenantCustomPropertiesForm" novalidate class="row">
14
- <div class="col-md-8 col-xs-12">
15
- <div class="card card--fullpage m-b-0">
16
- <div class="card-header separator">
17
- <div class="card-title">
18
- {{ 'Custom properties' | translate }}
19
- </div>
20
- </div>
21
- <div class="inner-scroll">
22
- <div class="card-block">
23
- <c8y-schema-form
24
- schema="vm.schema"
25
- form="vm.form"
26
- model="vm.tenant"
27
- options="{pristine: { errors: true }}"
28
- class="d-contents"
29
- >
30
- </c8y-schema-form>
31
- </div>
32
- </div>
33
- <div class="card-footer separator">
34
- <button
35
- title="{{ 'Cancel' | translate }}"
36
- class="btn btn-default"
37
- ng-click="vm.cancel()"
38
- >
39
- {{ 'Cancel' | translate }}
40
- </button>
41
- <button
42
- title="{{ 'Save' | translate }}"
43
- class="btn btn-primary"
44
- ng-disabled="tenantCustomPropertiesForm.$invalid || !tenantCustomPropertiesForm.$dirty"
45
- ng-click="vm.save(tenantCustomPropertiesForm)"
46
- translate
47
- >
48
- Save
49
- </button>
50
- </div>
51
- </div>
52
- </div>
53
- </form>
54
-
1
+ <c8y-breadcrumbs-set>
2
+ <c8y-breadcrumbs-item
3
+ path="#tenants"
4
+ label="{{ 'Subtenants' | translate }}"
5
+ icon="c8y-sub-tenants"
6
+ ></c8y-breadcrumbs-item>
7
+ <c8y-breadcrumbs-item
8
+ label="{{ 'Tenants' | translate }}"
9
+ icon="c8y-sub-tenants"
10
+ ></c8y-breadcrumbs-item>
11
+ </c8y-breadcrumbs-set>
12
+
13
+ <form name="tenantCustomPropertiesForm" novalidate class="row">
14
+ <div class="col-md-8 col-xs-12">
15
+ <div class="card card--fullpage m-b-0">
16
+ <div class="card-header separator">
17
+ <div class="card-title">
18
+ {{ 'Custom properties' | translate }}
19
+ </div>
20
+ </div>
21
+ <div class="inner-scroll">
22
+ <div class="card-block">
23
+ <c8y-loading ng-if="!vm.loaded"></c8y-loading>
24
+ <c8y-ui-empty-state
25
+ [icon]="'property-script'"
26
+ [title]="'No custom properties yet.' | translate"
27
+ [subtitle]="'Add a new custom property for tenants in Properties library.' | translate"
28
+ ng-if="vm.loaded && !vm.hasCustomProperties"
29
+ ></c8y-ui-empty-state>
30
+ <c8y-schema-form
31
+ class="d-contents"
32
+ ng-if="vm.loaded && vm.hasCustomProperties"
33
+ schema="vm.schema"
34
+ form="vm.form"
35
+ model="vm.tenant"
36
+ options="{pristine: { errors: true }}"
37
+ class="d-contents"
38
+ >
39
+ </c8y-schema-form>
40
+ </div>
41
+ </div>
42
+ <div
43
+ class="card-footer separator"
44
+ ng-if="vm.loaded && vm.hasCustomProperties"
45
+ >
46
+ <button
47
+ title="{{ 'Cancel' | translate }}"
48
+ class="btn btn-default"
49
+ ng-click="vm.cancel()"
50
+ >
51
+ {{ 'Cancel' | translate }}
52
+ </button>
53
+ <button
54
+ title="{{ 'Save' | translate }}"
55
+ class="btn btn-primary"
56
+ ng-disabled="tenantCustomPropertiesForm.$invalid || !tenantCustomPropertiesForm.$dirty"
57
+ ng-click="vm.save(tenantCustomPropertiesForm)"
58
+ translate
59
+ >
60
+ Save
61
+ </button>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ </form>
@@ -1,3 +1,5 @@
1
+ <c8y-ui-title-set title="tenant.company"></c8y-ui-title-set>
2
+
1
3
  <c8y-breadcrumbs-set>
2
4
  <c8y-breadcrumbs-item
3
5
  icon="c8y-sub-tenants"