New packages org (#2639)

New packages org
This commit is contained in:
Eugenio Romano
2017-11-16 14:12:52 +00:00
committed by GitHub
parent 6a24c6ef75
commit a52bb5600a
1984 changed files with 17179 additions and 40423 deletions

38
lib/core/README.md Normal file
View File

@@ -0,0 +1,38 @@
# Alfresco Core Library
Contains a variety of components, directives and services used throughout ADF
<!-- markdown-toc start - Don't edit this section. npm run toc to generate it-->
<!-- toc -->
- [Documentation](#documentation)
- [Prerequisites](#prerequisites)
- [Install](#install)
- [License](#license)
<!-- tocstop -->
<!-- markdown-toc end -->
## Documentation
See the [ADF Core](../../docs/README.md#adf-core) section of the [docs index](../../docs/README.md)
for all available documentation on this library.
## Prerequisites
Before you start using this development framework, make sure you have installed all required software and done all the
necessary configuration, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
> If you plan using this component with projects generated by Angular CLI, please refer to the following article: [Using ADF with Angular CLI](https://github.com/Alfresco/alfresco-ng2-components/wiki/Angular-CLI)
## Install
```sh
npm install @alfresco/core
```
## License
[Apache Version 2.0](https://github.com/Alfresco/alfresco-ng2-components/blob/master/LICENSE)

View File

@@ -0,0 +1,43 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { HttpClientModule } from '@angular/common/http';
import { APP_INITIALIZER, NgModule } from '@angular/core';
import { AppConfigService } from './app-config.service';
export function startupServiceFactory(configService: AppConfigService): Function {
return () => configService.load();
}
@NgModule({
imports: [
HttpClientModule
],
providers: [
AppConfigService,
{
provide: APP_INITIALIZER,
useFactory: startupServiceFactory,
deps: [
AppConfigService
],
multi: true
}
]
})
export class AppConfigModule {
}

View File

@@ -0,0 +1,120 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { HttpClientModule } from '@angular/common/http';
import { inject, TestBed } from '@angular/core/testing';
import { AppConfigService } from './app-config.service';
import { AppConfigModule } from './app-config.module';
declare let jasmine: any;
describe('AppConfigService', () => {
let appConfigService: AppConfigService;
const mockResponse = {
ecmHost: 'http://localhost:4000/ecm',
bpmHost: 'http://localhost:4000/ecm',
application: {
name: 'Custom Name'
},
files: {
'excluded': ['exluded']
}
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
HttpClientModule,
AppConfigModule
],
providers: [
{ provide: AppConfigService, useClass: AppConfigService }
]
});
jasmine.Ajax.install();
});
beforeEach(
inject([AppConfigService], (appConfig: AppConfigService) => {
appConfigService = appConfig;
jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200,
contentType: 'application/json',
responseText: JSON.stringify(mockResponse)
});
})
);
afterEach(() => {
jasmine.Ajax.uninstall();
});
it('should export service in the module', () => {
expect(appConfigService).toBeDefined();
});
it('should skip the optional port number', () => {
appConfigService.config.testUrl = 'http://{hostname}{:port}';
spyOn(appConfigService, 'getLocationHostname').and.returnValue('localhost');
spyOn(appConfigService, 'getLocationPort').and.returnValue('');
expect(appConfigService.get('testUrl')).toBe('http://localhost');
});
it('should set the optional port number', () => {
appConfigService.config.testUrl = 'http://{hostname}{:port}';
spyOn(appConfigService, 'getLocationHostname').and.returnValue('localhost');
spyOn(appConfigService, 'getLocationPort').and.returnValue(':9090');
expect(appConfigService.get('testUrl')).toBe('http://localhost:9090');
});
it('should set the mandatory port number', () => {
appConfigService.config.testUrl = 'http://{hostname}:{port}';
spyOn(appConfigService, 'getLocationHostname').and.returnValue('localhost');
spyOn(appConfigService, 'getLocationPort').and.returnValue('9090');
expect(appConfigService.get('testUrl')).toBe('http://localhost:9090');
});
it('should load external settings', () => {
appConfigService.load().then(config => {
expect(config).toEqual(mockResponse);
});
});
it('should retrieve settings', () => {
appConfigService.load().then(() => {
expect(appConfigService.get('ecmHost')).toBe(mockResponse.ecmHost);
expect(appConfigService.get('bpmHost')).toBe(mockResponse.bpmHost);
expect(appConfigService.get('application.name')).toBe(mockResponse.application.name);
});
});
it('should take excluded file list', () => {
appConfigService.load().then(() => {
expect(appConfigService.get('files.excluded')[0]).toBe('exluded');
});
});
});

View File

@@ -0,0 +1,86 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ObjectUtils } from '../utils/object-utils';
@Injectable()
export class AppConfigService {
static APP_CONFIG_LANGUAGES_KEY = 'languages';
config: any = {
application: {
name: 'Alfresco ADF Application'
},
ecmHost: 'http://{hostname}{:port}/ecm',
bpmHost: 'http://{hostname}{:port}/bpm',
logLevel: 'silent'
};
constructor(private http: HttpClient) {
}
get<T>(key: string, defaultValue?: T): T {
let result: any = ObjectUtils.getValue(this.config, key);
if (typeof result === 'string') {
const map = new Map<string, string>();
map.set('hostname', this.getLocationHostname());
map.set(':port', this.getLocationPort(':'));
map.set('port', this.getLocationPort());
result = this.formatString(result, map);
}
if (result === undefined) {
return defaultValue;
}
return <T> result;
}
getLocationHostname(): string {
return location.hostname;
}
getLocationPort(prefix: string = ''): string {
return location.port ? prefix + location.port : '';
}
load(): Promise<any> {
return new Promise(resolve => {
this.http.get('app.config.json').subscribe(
(data: any) => {
this.config = Object.assign({}, this.config, data || {});
resolve(this.config);
},
() => {
resolve(this.config);
}
);
});
}
private formatString(str: string, map: Map<string, string>): string {
let result = str;
map.forEach((value, key) => {
const expr = new RegExp('{' + key + '}', 'gm');
result = result.replace(expr, value);
});
return result;
}
}

View File

@@ -0,0 +1,18 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './public-api';

View File

@@ -0,0 +1,20 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './app-config.service';
export * from './app-config.module';

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 187 43" style="enable-background:new 0 0 187 43;" width="187" height="43" xml:space="preserve">
<style type="text/css">
.st0{fill:#77777A;}
.st1{fill:none;}
.st2{fill:#77BC1F;}
.st3{fill:#F38B00;}
.st4{fill:#0071CE;}
.st5{fill:#002F87;}
.st6{fill:#F9BE00;}
.st7{fill:#00AF41;}
</style>
<g>
<path class="st0" d="M59.7,4.4h3.2l11.9,30.2h-3.1L68,25.2H54.2l-3.7,9.4h-3.1L59.7,4.4z M55.1,22.7H67L61.1,7.2L55.1,22.7z"/>
<rect x="75.6" y="4.4" class="st0" width="2.7" height="30.2"/>
<path class="st0" d="M90.4,15h-4.3v19.6h-2.7V15h-3.7v-2.2h3.7v-2c0-3.8,1-6.4,5.3-6.4c0.8,0,1.4,0,2.2,0.2v2.3
c-0.7-0.1-1.3-0.2-1.9-0.2c-3,0-2.9,1.9-2.9,4.2v1.9h4.3V15z"/>
<path class="st0" d="M91.4,12.7h2.5v5.1H94c1.4-3.5,4.3-5.6,8.3-5.4v2.7c-4.8-0.3-8.2,3.3-8.2,7.8v11.6h-2.7V12.7z"/>
<path class="st0" d="M104.2,24.4c0.1,3.9,2.1,8.6,7.2,8.6c3.9,0,6-2.3,6.9-5.6h2.7c-1.1,4.9-4,7.8-9.6,7.8c-7,0-9.9-5.3-9.9-11.6
c0-5.8,2.9-11.6,9.9-11.6c7.1,0,9.9,6.1,9.6,12.3H104.2z M118.4,22.1c-0.1-4-2.6-7.8-7-7.8c-4.4,0-6.8,3.8-7.2,7.8H118.4z"/>
<path class="st0" d="M136.3,19.1c-0.1-3.3-2.7-4.8-5.7-4.8c-2.4,0-5.2,0.9-5.2,3.8c0,2.4,2.7,3.2,4.6,3.7l3.6,0.8
c3,0.5,6.2,2.2,6.2,6c0,4.7-4.7,6.6-8.8,6.6c-5.1,0-8.6-2.4-9-7.7h2.7c0.2,3.6,2.9,5.4,6.5,5.4c2.5,0,6-1.1,6-4.1
c0-2.5-2.4-3.4-4.8-4l-3.4-0.8c-3.5-0.9-6.1-2.1-6.1-5.8c0-4.4,4.4-6.1,8.2-6.1c4.4,0,7.9,2.3,8,7H136.3z"/>
<path class="st0" d="M157.6,19.6c-0.7-3.3-2.7-5.2-6.2-5.2c-5.1,0-7.7,4.6-7.7,9.3c0,4.7,2.6,9.3,7.7,9.3c3.3,0,6-2.6,6.4-6.2h2.7
c-0.7,5.2-4.2,8.5-9.1,8.5c-6.7,0-10.4-5.3-10.4-11.6c0-6.3,3.7-11.6,10.4-11.6c4.7,0,8.3,2.5,8.9,7.5H157.6z"/>
<path class="st0" d="M182.3,23.7c0,6.3-3.6,11.6-10.4,11.6s-10.4-5.3-10.4-11.6c0-6.3,3.6-11.6,10.4-11.6S182.3,17.4,182.3,23.7
M164.3,23.7c0,4.7,2.6,9.3,7.7,9.3c5.2,0,7.7-4.7,7.7-9.3c0-4.7-2.5-9.3-7.7-9.3C166.8,14.4,164.3,19,164.3,23.7"/>
<polygon class="st0" points="181.4,11.7 183.8,11.7 183.8,12 182.8,12 182.8,14.8 182.5,14.8 182.5,12 181.4,12 "/>
<polygon class="st0" points="184,11.7 184.4,11.7 185.5,14.4 186.6,11.7 187,11.7 187,14.8 186.7,14.8 186.7,12.1 186.7,12.1
185.6,14.8 185.3,14.8 184.3,12.1 184.3,14.8 184,14.8 "/>
<path class="st1" d="M21.6,21.5v8.6l0,0.3c0,4.9-4,8.9-9,8.9c-4.9,0-9-4-9-8.9c0-0.5,0-1.1,0.1-1.6c3.5,2.4,8.3,2.1,11.4-1
L21.6,21.5L21.6,21.5L21.6,21.5z"/>
<g>
<g>
<path class="st2" d="M15.3,27.8l5.2-5.2h-7.8c-4.3,0-7.8,3.5-7.8,7.8c0,4.3,3.5,7.8,7.8,7.8c0.3,0,0.7,0,1-0.1
C11.9,34.8,12.5,30.6,15.3,27.8z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M21.6,30.4v-7.3l-5.5,5.5l0,0c-3.1,3-3.1,8,0,11c3.1,3,8,3,11.1,0c0.2-0.2,0.4-0.5,0.6-0.7
C24.2,37.7,21.6,34.3,21.6,30.4z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M27.9,27.8l-5.2-5.2v7.8c0,4.3,3.5,7.8,7.8,7.8c4.3,0,7.8-3.5,7.8-7.8c0-0.3,0-0.6-0.1-1
C34.9,31.1,30.7,30.6,27.9,27.8z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M39.8,16c-0.2-0.2-0.5-0.4-0.7-0.6c-1.2,3.6-4.5,6.1-8.5,6.1h-7.3l5.5,5.5l0,0c3.1,3,8,3,11.1,0
C42.8,23.9,42.8,19,39.8,16z"/>
</g>
</g>
<g>
<g>
<path class="st3" d="M30.5,4.8c-0.3,0-0.7,0-1,0.1c1.7,3.3,1.2,7.5-1.7,10.3l-5.2,5.2h7.8c4.3,0,7.8-3.5,7.8-7.8
C38.4,8.3,34.9,4.8,30.5,4.8z"/>
</g>
</g>
<g>
<g>
<path class="st4" d="M27.1,3.4c-3.1-3-8-3-11.1,0c-0.2,0.2-0.4,0.5-0.6,0.7c3.6,1.2,6.2,4.5,6.2,8.5v7.3l5.5-5.5l0,0
C30.2,11.4,30.2,6.4,27.1,3.4z"/>
</g>
</g>
<path class="st4" d="M15.3,15.2l0.2,0.2l5,4.9h0l0-7.8v0c0-4.3-3.5-7.8-7.8-7.8c-4.3,0-7.8,3.5-7.8,7.8c0,0.3,0,0.6,0.1,1
C8.3,11.9,12.5,12.4,15.3,15.2z"/>
<path class="st1" d="M21.6,21.5L0,21.5c0-2.3,0.9-4.6,2.6-6.3c3.5-3.5,9.2-3.5,12.7,0L21.6,21.5L21.6,21.5z"/>
<path class="st1" d="M21.6,21.5v8.6l0,0.3c0,4.9-4,8.9-9,8.9c-4.9,0-9-4-9-8.9c0-4.9,4-8.9,9-8.9H21.6L21.6,21.5z"/>
<path class="st4" d="M4.2,27.6c0.1-0.2,0.1-0.4,0.2-0.5c0,0,0,0,0-0.1c0.1-0.2,0.2-0.4,0.3-0.6c0,0,0-0.1,0.1-0.1
c0.1-0.2,0.2-0.4,0.3-0.5c0,0,0,0,0-0.1c0.1-0.2,0.2-0.3,0.3-0.5c0,0,0-0.1,0.1-0.1c0.1-0.2,0.2-0.3,0.4-0.5c0,0,0.1-0.1,0.1-0.1
c0.1-0.1,0.3-0.3,0.4-0.4c0,0,0,0,0,0c0.1-0.1,0.3-0.3,0.4-0.4c0,0,0.1-0.1,0.1-0.1c0.2-0.1,0.3-0.3,0.5-0.4c0,0,0,0,0.1,0
c0.2-0.1,0.3-0.2,0.5-0.3c0,0,0.1,0,0.1-0.1c0.2-0.1,0.3-0.2,0.5-0.3c0,0,0.1,0,0.1-0.1c0.2-0.1,0.4-0.2,0.5-0.3c0,0,0,0,0,0
C9.4,22.1,9.6,22,9.8,22c0,0,0.1,0,0.1,0c0.2-0.1,0.4-0.1,0.6-0.2c0,0,0.1,0,0.1,0c0.2,0,0.4-0.1,0.6-0.1c0,0,0.1,0,0.1,0
c0.2,0,0.4-0.1,0.6-0.1c0,0,0.1,0,0.1,0c0.2,0,0.4,0,0.7,0H20L14.5,16c-3.1-3-8-3-11.1,0c-3.1,3-3.1,8,0,11
C3.7,27.2,3.9,27.4,4.2,27.6C4.2,27.6,4.2,27.6,4.2,27.6z"/>
<path class="st5" d="M14.5,16l4.4,4.3H13l-0.3,0c-3.6,0-6.6-2.4-7.5-5.7C8.1,13,12,13.5,14.5,16L14.5,16L14.5,16z"/>
<path class="st5" d="M20.5,12.6v6.2l-4.2-4.1l-0.2-0.2c-2.5-2.5-3-6.3-1.3-9.3C18.1,6,20.5,9,20.5,12.6L20.5,12.6L20.5,12.6z"/>
<path class="st5" d="M27.1,14.4l-4.4,4.3v-5.8l0-0.3c0-3.6,2.4-6.6,5.7-7.5C30.1,8,29.7,11.9,27.1,14.4L27.1,14.4L27.1,14.4z"/>
<path class="st6" d="M30.5,20.3h-6.2l4.2-4.1l0.2-0.2c2.5-2.5,6.4-2.9,9.3-1.3C37.2,17.9,34.1,20.3,30.5,20.3L30.5,20.3L30.5,20.3z
"/>
<path class="st7" d="M28.7,27l-4.4-4.3h5.9l0.3,0c3.6,0,6.6,2.4,7.5,5.7C35.1,29.9,31.3,29.5,28.7,27L28.7,27L28.7,27z"/>
<path class="st7" d="M22.8,30.4v-6.2l4.2,4.1l0.2,0.2c2.5,2.5,3,6.3,1.3,9.3C25.2,36.9,22.8,33.9,22.8,30.4L22.8,30.4L22.8,30.4z"
/>
<path class="st7" d="M16.1,28.6l4.4-4.3v5.8l0,0.3c0,3.6-2.4,6.6-5.7,7.5C13.1,34.9,13.6,31.1,16.1,28.6L16.1,28.6L16.1,28.6z"/>
<path class="st7" d="M12.7,22.6h6.2l-4.2,4.1L14.5,27C12,29.5,8.1,30,5.1,28.3C6.1,25,9.1,22.6,12.7,22.6L12.7,22.6L12.7,22.6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 20.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="2560px"
height="2560px" viewBox="0 0 2560 2560" enable-background="new 0 0 2560 2560" xml:space="preserve">
<g id="B">
<rect y="0" fill="#FAFAFA" width="2560" height="2560"/>
<g>
<defs>
<rect id="SVGID_1_" width="2560" height="2560"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_2_)">
<circle opacity="0.8" fill="#8BC34A" cx="16" cy="6272" r="5120"/>
<circle opacity="0.6" fill="#03A9F4" cx="4096" cy="2048" r="2560"/>
<circle opacity="0.8" fill="#FF9800" cx="0" cy="-256" r="1920"/>
<circle opacity="0.3" fill="#FFD600" cx="-384" cy="1280" r="1280"/>
</g>
</g>
</g>
<g id="Layer_2" display="none">
<rect y="640" display="inline" fill="none" stroke="#FFFFFF" stroke-miterlimit="10" width="2560" height="1280"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -0,0 +1,208 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="566px" height="165px" viewBox="0 0 566 165" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
<title>empty_doc_lib</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="5.68434189e-14" y="-1.01962883e-12" width="78.1679389" height="78.1679389" rx="2"></rect>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-2">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter2"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter2" result="shadowBlurOuter2"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0" type="matrix" in="shadowBlurOuter2" result="shadowMatrixOuter2"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="shadowMatrixOuter2"></feMergeNode>
</feMerge>
</filter>
<rect id="path-3" x="-4.54747351e-13" y="5.68434189e-13" width="78.1679389" height="78.1679389" rx="2"></rect>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter2"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter2" result="shadowBlurOuter2"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0" type="matrix" in="shadowBlurOuter2" result="shadowMatrixOuter2"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="shadowMatrixOuter2"></feMergeNode>
</feMerge>
</filter>
<rect id="path-5" x="-1.08002496e-12" y="7.81597009e-14" width="78.1679389" height="78.1679389" rx="2"></rect>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-6">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter2"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter2" result="shadowBlurOuter2"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0" type="matrix" in="shadowBlurOuter2" result="shadowMatrixOuter2"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="shadowMatrixOuter2"></feMergeNode>
</feMerge>
</filter>
<rect id="path-7" x="1.29318778e-12" y="9.23705556e-14" width="78.1679389" height="78.1679389" rx="2"></rect>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-8">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter2"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter2" result="shadowBlurOuter2"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0" type="matrix" in="shadowBlurOuter2" result="shadowMatrixOuter2"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="shadowMatrixOuter2"></feMergeNode>
</feMerge>
</filter>
<rect id="path-9" x="-2.96651592e-13" y="-7.60280727e-13" width="78.1679389" height="78.1679389" rx="2"></rect>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-10">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter2"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter2" result="shadowBlurOuter2"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0" type="matrix" in="shadowBlurOuter2" result="shadowMatrixOuter2"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="shadowMatrixOuter2"></feMergeNode>
</feMerge>
</filter>
<rect id="path-11" x="3.48165941e-13" y="2.27373675e-13" width="78.1679389" height="78.1679389" rx="2"></rect>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-12">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter2"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter2" result="shadowBlurOuter2"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0" type="matrix" in="shadowBlurOuter2" result="shadowMatrixOuter2"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="shadowMatrixOuter2"></feMergeNode>
</feMerge>
</filter>
<rect id="path-13" x="0" y="-5.40012479e-13" width="78.1679389" height="78.1679389" rx="2"></rect>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-14">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter2"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter2" result="shadowBlurOuter2"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0" type="matrix" in="shadowBlurOuter2" result="shadowMatrixOuter2"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="shadowMatrixOuter2"></feMergeNode>
</feMerge>
</filter>
<rect id="path-15" x="0" y="0" width="78.1679389" height="78.1679389" rx="2"></rect>
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-16">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter2"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter2" result="shadowBlurOuter2"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.12 0" type="matrix" in="shadowBlurOuter2" result="shadowMatrixOuter2"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="shadowMatrixOuter2"></feMergeNode>
</feMerge>
</filter>
</defs>
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="empty-folder-state-desktop" transform="translate(-37.000000, -168.000000)">
<g id="empty_doc_lib" transform="translate(38.000000, 169.000000)">
<g id="Group-5" transform="translate(241.569490, 92.634375) rotate(-355.000000) translate(-241.569490, -92.634375) translate(202.069490, 53.134375)">
<g id="Rectangle-1196-Copy-2">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-1"></use>
</g>
<g id="filetype_video" transform="translate(9.770992, 9.770992)">
<polygon id="Fill-1" points="0 58.6259542 58.6259542 58.6259542 58.6259542 0 0 0"></polygon>
<path d="M39.0839695,21.9847328 L43.9694656,21.9847328 L43.9694656,17.0992366 L39.0839695,17.0992366 L39.0839695,21.9847328 Z M39.0839695,31.7557252 L43.9694656,31.7557252 L43.9694656,26.870229 L39.0839695,26.870229 L39.0839695,31.7557252 Z M39.0839695,41.5267176 L43.9694656,41.5267176 L43.9694656,36.6412214 L39.0839695,36.6412214 L39.0839695,41.5267176 Z M14.6564885,21.9847328 L19.5419847,21.9847328 L19.5419847,17.0992366 L14.6564885,17.0992366 L14.6564885,21.9847328 Z M14.6564885,31.7557252 L19.5419847,31.7557252 L19.5419847,26.870229 L14.6564885,26.870229 L14.6564885,31.7557252 Z M14.6564885,41.5267176 L19.5419847,41.5267176 L19.5419847,36.6412214 L14.6564885,36.6412214 L14.6564885,41.5267176 Z M43.9694656,7.32824427 L43.9694656,12.2137405 L39.0839695,12.2137405 L39.0839695,7.32824427 L19.5419847,7.32824427 L19.5419847,12.2137405 L14.6564885,12.2137405 L14.6564885,7.32824427 L9.77099237,7.32824427 L9.77099237,51.2977099 L14.6564885,51.2977099 L14.6564885,46.4122137 L19.5419847,46.4122137 L19.5419847,51.2977099 L39.0839695,51.2977099 L39.0839695,46.4122137 L43.9694656,46.4122137 L43.9694656,51.2977099 L48.8549618,51.2977099 L48.8549618,7.32824427 L43.9694656,7.32824427 Z" id="Fill-2" fill="#FFC107"></path>
</g>
</g>
<g id="Group-7" transform="translate(515.948329, 81.354522) rotate(-345.000000) translate(-515.948329, -81.354522) translate(476.448329, 41.854522)">
<g id="Rectangle-1196-Copy-3">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-3"></use>
</g>
<g id="filetype_image" transform="translate(9.770992, 9.770992)">
<polygon id="Fill-1" points="0 58.6259542 58.6259542 58.6259542 58.6259542 0 0 0"></polygon>
<path d="M20.7636031,32.9773435 L26.8704733,40.3178015 L35.4200916,29.3132214 L46.412458,43.9697099 L12.2139847,43.9697099 L20.7636031,32.9773435 Z M51.2979542,46.412458 L51.2979542,12.2139847 C51.2979542,9.51474809 49.1116947,7.32848855 46.412458,7.32848855 L12.2139847,7.32848855 C9.51474809,7.32848855 7.32848855,9.51474809 7.32848855,12.2139847 L7.32848855,46.412458 C7.32848855,49.1116947 9.51474809,51.2979542 12.2139847,51.2979542 L46.412458,51.2979542 C49.1116947,51.2979542 51.2979542,49.1116947 51.2979542,46.412458 L51.2979542,46.412458 Z" id="Fill-2" fill="#22BE73"></path>
</g>
</g>
<g id="Group-8" transform="translate(309.051884, 62.261808) rotate(-5.000000) translate(-309.051884, -62.261808) translate(269.551884, 22.761808)">
<g id="Rectangle-1196-Copy-4">
<use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-5"></use>
</g>
<g id="filetype_googledocs" transform="translate(9.770992, 9.770992)">
<polygon id="Fill-1" points="6.82121026e-13 58.6259542 58.6259542 58.6259542 58.6259542 -2.98427949e-13 6.82121026e-13 -2.98427949e-13"></polygon>
<g id="Group-6" transform="translate(9.770992, 4.885496)">
<path d="M7.32824427,21.9847328 L31.7557252,21.9847328 L31.7557252,19.5419847 L7.32824427,19.5419847 L7.32824427,21.9847328 Z M7.32824427,26.870229 L31.7557252,26.870229 L31.7557252,24.4274809 L7.32824427,24.4274809 L7.32824427,26.870229 Z M7.32824427,31.7557252 L31.7557252,31.7557252 L31.7557252,29.3129771 L7.32824427,29.3129771 L7.32824427,31.7557252 Z M7.32824427,36.6412214 L21.9847328,36.6412214 L21.9847328,34.1984733 L7.32824427,34.1984733 L7.32824427,36.6412214 Z M29.3129771,0 L4.88549618,0 C2.18625954,0 0.0244274809,2.18625954 0.0244274809,4.88549618 L0,43.9694656 C0,46.6687023 2.16183206,48.8549618 4.8610687,48.8549618 L34.1984733,48.8549618 C36.8977099,48.8549618 39.0839695,46.6687023 39.0839695,43.9694656 L39.0839695,9.77099237 L29.3129771,0 Z" id="Fill-2" fill="#2979FF"></path>
<polygon id="Fill-4" fill-opacity="0.5" fill="#FFFFFF" points="29.3129771 9.77099237 29.3129771 -2.84217094e-14 39.0839695 9.77099237"></polygon>
<polygon id="Fill-5" fill-opacity="0.2" fill="#000000" points="39.0839695 9.77099237 39.0839695 19.5419847 29.3129771 9.77099237"></polygon>
</g>
</g>
</g>
<g id="Group-9" transform="translate(155.408682, 49.364493) rotate(-345.000000) translate(-155.408682, -49.364493) translate(115.908682, 9.864493)">
<g id="Rectangle-1196-Copy-5">
<use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-7"></use>
</g>
<g id="filetype_pdf" transform="translate(9.770992, 9.770992)">
<polygon id="Fill-1" points="0 58.6259542 58.6259542 58.6259542 58.6259542 0 0 0"></polygon>
<path d="M45.1888855,25.5877863 L45.1888855,21.9187786 L37.853313,21.9187786 L37.853313,36.5923664 L41.5198779,36.5923664 L41.5198779,31.7777099 L45.1888855,31.7777099 L45.1888855,28.1087023 L41.5198779,28.1087023 L41.5198779,25.5877863 L45.1888855,25.5877863 Z M29.3696489,32.9233588 L31.7757557,32.9233588 L31.7757557,25.5877863 L29.3696489,25.5877863 L29.3696489,32.9233588 Z M35.4447634,32.9233588 L35.4447634,25.5877863 C35.4447634,24.5960305 35.1027786,23.7361832 34.4139237,23.0082443 C33.7275115,22.2827481 32.8481221,21.9187786 31.7781985,21.9187786 L25.703084,21.9187786 L25.703084,36.5923664 L31.7781985,36.5923664 C32.8481221,36.5923664 33.7275115,36.2308397 34.4139237,35.5029008 C35.1027786,34.7774046 35.4447634,33.9175573 35.4447634,32.9233588 L35.4447634,32.9233588 Z M17.1070534,28.1087023 L19.5131603,28.1087023 L19.5131603,25.5877863 L17.1070534,25.5877863 L17.1070534,28.1087023 Z M23.1821679,28.1087023 L23.1821679,25.5877863 C23.1821679,24.5960305 22.8181985,23.7361832 22.0927023,23.0082443 C21.3672061,22.2827481 20.5073588,21.9187786 19.5131603,21.9187786 L13.4380458,21.9187786 L13.4380458,36.5923664 L17.1070534,36.5923664 L17.1070534,31.7777099 L19.5131603,31.7777099 C20.5073588,31.7777099 21.3672061,31.4161832 22.0927023,30.6882443 C22.8181985,29.9627481 23.1821679,29.1029008 23.1821679,28.1087023 L23.1821679,28.1087023 Z M46.483542,7.32824427 C47.783084,7.32824427 48.9091908,7.8070229 49.8643053,8.7621374 C50.8218626,9.71725191 51.2981985,10.8433588 51.2981985,12.1429008 L51.2981985,46.3682443 C51.2981985,47.670229 50.8218626,48.8158779 49.8643053,49.8076336 C48.9091908,50.8018321 47.783084,51.2977099 46.483542,51.2977099 L12.2581985,51.2977099 C10.9586565,51.2977099 9.81300763,50.8018321 8.81880916,49.8076336 C7.82461069,48.8158779 7.32873282,47.670229 7.32873282,46.3682443 L7.32873282,12.1429008 C7.32873282,10.8433588 7.82461069,9.71725191 8.81880916,8.7621374 C9.81300763,7.8070229 10.9586565,7.32824427 12.2581985,7.32824427 L46.483542,7.32824427 Z" id="Fill-2" fill="#E91E63"></path>
</g>
</g>
<g id="Group-12" transform="translate(49.364493, 62.584254) rotate(-15.000000) translate(-49.364493, -62.584254) translate(9.864493, 23.084254)">
<g id="Rectangle-1196-Copy-7">
<use fill="black" fill-opacity="1" filter="url(#filter-10)" xlink:href="#path-9"></use>
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-9"></use>
</g>
<g id="filetype_forms" transform="translate(9.770992, 9.770992)">
<polygon id="Fill-1" points="0 58.6259542 58.6259542 58.6259542 58.6259542 0 0 0"></polygon>
<path d="M24.4274809,24.4250382 L41.5267176,24.4250382 L41.5267176,19.539542 L24.4274809,19.539542 L24.4274809,24.4250382 Z M24.4274809,31.7532824 L41.5267176,31.7532824 L41.5267176,26.8677863 L24.4274809,26.8677863 L24.4274809,31.7532824 Z M24.4274809,39.0839695 L41.5267176,39.0839695 L41.5267176,34.1984733 L24.4274809,34.1984733 L24.4274809,39.0839695 Z M17.0992366,24.4250382 L21.9847328,24.4250382 L21.9847328,19.539542 L17.0992366,19.539542 L17.0992366,24.4250382 Z M17.0992366,31.7532824 L21.9847328,31.7532824 L21.9847328,26.8677863 L17.0992366,26.8677863 L17.0992366,31.7532824 Z M17.0992366,39.0839695 L21.9847328,39.0839695 L21.9847328,34.1984733 L17.0992366,34.1984733 L17.0992366,39.0839695 Z M43.9694656,9.77099237 L14.6564885,9.77099237 C11.9694656,9.77099237 9.77099237,11.9694656 9.77099237,14.6564885 L9.77099237,43.9694656 C9.77099237,46.6564885 11.9694656,48.8549618 14.6564885,48.8549618 L43.9694656,48.8549618 C46.6564885,48.8549618 48.8549618,46.6564885 48.8549618,43.9694656 L48.8549618,14.6564885 C48.8549618,11.9694656 46.6564885,9.77099237 43.9694656,9.77099237 L43.9694656,9.77099237 Z" id="Fill-2" fill="#651FFF"></path>
</g>
</g>
<g id="Group-11" transform="translate(107.814782, 114.998541) rotate(-10.000000) translate(-107.814782, -114.998541) translate(68.314782, 75.498541)">
<g id="Rectangle-1196-Copy-6">
<use fill="black" fill-opacity="1" filter="url(#filter-12)" xlink:href="#path-11"></use>
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-11"></use>
</g>
<g id="filetype_excel" transform="translate(9.770992, 9.770992)">
<polygon id="Fill-1" points="-5.68434189e-14 58.6259542 58.6259542 58.6259542 58.6259542 -1.56319402e-13 -5.68434189e-14 -1.56319402e-13"></polygon>
<g id="Group-10" transform="translate(4.885496, 4.885496)" fill="#22BE73">
<path d="M47.1621374,41.632 L28.848855,41.632 L28.848855,38.3025344 L33.2873282,38.3025344 L33.2873282,34.4161221 L28.848855,34.4161221 L28.848855,32.1981069 L33.2873282,32.1981069 L33.2873282,28.3116947 L28.848855,28.3116947 L28.848855,26.0936794 L33.2873282,26.0936794 L33.2873282,22.2072672 L28.848855,22.2072672 L28.848855,19.9868092 L33.2873282,19.9868092 L33.2873282,16.1028397 L28.848855,16.1028397 L28.848855,13.8823817 L33.2873282,13.8823817 L33.2873282,9.99841221 L28.848855,9.99841221 L28.848855,6.66894656 L47.1621374,6.66894656 L47.1621374,41.632 L47.1621374,41.632 Z M16.3444275,33.1141374 C15.4015267,30.7984122 14.2509924,28.5632977 13.5743511,26.1425344 C12.819542,28.3947481 11.7422901,30.5223817 10.8775573,32.730626 C9.6610687,32.7135267 8.4470229,32.6646718 7.23053435,32.613374 C8.65709924,29.821313 10.0348092,27.0072672 11.5053435,24.2323053 C10.2546565,21.3742901 8.88427481,18.572458 7.59694656,15.731542 C8.81832061,15.6582595 10.0396947,15.5874198 11.2610687,15.5190229 C12.0867176,17.690626 12.9929771,19.832916 13.6745038,22.0582595 C14.4073282,19.6985649 15.5016794,17.4781069 16.4372519,15.1990229 C17.6928244,15.1086412 18.9532824,15.032916 20.2112977,14.9718473 C18.7309924,18.0057405 17.2433588,21.0420763 15.7337405,24.0661985 C17.260458,27.1758168 18.8189313,30.2610076 20.3505344,33.3681832 C19.0143511,33.2900153 17.6806107,33.2069618 16.3444275,33.1141374 L16.3444275,33.1141374 Z M48.8329771,37.2203969 C48.8280916,27.591084 48.8158779,17.961771 48.8427481,8.32757252 C48.8036641,7.38467176 48.8720611,6.34161832 48.300458,5.51841221 C47.4845802,4.9590229 46.4512977,5.0249771 45.5132824,4.98589313 C39.9584733,5.01520611 34.4036641,5.00299237 28.848855,5.00299237 L28.848855,0.564519084 L25.551145,0.564519084 C17.0381679,2.06680916 8.5178626,3.52757252 4.68958206e-13,5.00787786 L4.68958206e-13,43.852458 C8.46900763,45.3327634 16.9429008,46.7544427 25.4021374,48.2909313 L28.848855,48.2909313 L28.848855,43.2979542 C34.6039695,43.2857405 40.359084,43.3126107 46.1068702,43.2979542 C47.0351145,43.2588702 48.4225954,43.2295573 48.6448855,42.0765802 C48.9819847,40.4839084 48.8036641,38.8350534 48.8329771,37.2203969 L48.8329771,37.2203969 Z" id="Fill-2"></path>
<path d="M35.5077863,13.8821374 L43.2781679,13.8821374 L43.2781679,9.99816794 L35.5077863,9.99816794 L35.5077863,13.8821374 Z M35.5077863,19.9865649 L43.2781679,19.9865649 L43.2781679,16.1025954 L35.5077863,16.1025954 L35.5077863,19.9865649 Z M35.5077863,26.0909924 L43.2781679,26.0909924 L43.2781679,22.2070229 L35.5077863,22.2070229 L35.5077863,26.0909924 Z M35.5077863,32.1954198 L43.2781679,32.1954198 L43.2781679,28.3114504 L35.5077863,28.3114504 L35.5077863,32.1954198 Z M35.5077863,38.3022901 L43.2781679,38.3022901 L43.2781679,34.4183206 L35.5077863,34.4183206 L35.5077863,38.3022901 Z" id="Combined-Shape"></path>
</g>
</g>
</g>
<g id="Group-4" transform="translate(388.820630, 86.064353) rotate(-350.000000) translate(-388.820630, -86.064353) translate(349.320630, 46.564353)">
<g id="Rectangle-1196-Copy">
<use fill="black" fill-opacity="1" filter="url(#filter-14)" xlink:href="#path-13"></use>
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-13"></use>
</g>
<g id="filetype_audio" transform="translate(9.770992, 9.770992)">
<polygon id="Fill-1" points="-1.13686838e-13 58.6259542 58.6259542 58.6259542 58.6259542 -6.39488462e-14 -1.13686838e-13 -6.39488462e-14"></polygon>
<path d="M29.3129771,7.32824427 L43.9694656,7.32824427 L43.9694656,17.0601527 L34.2375573,17.0601527 L34.2375573,41.5658015 C34.2375573,44.2381679 33.2629008,46.5270229 31.3160305,48.4348092 C29.3691603,50.3450382 27.0607634,51.2977099 24.3883969,51.2977099 C21.7160305,51.2977099 19.4271756,50.3450382 17.5193893,48.4348092 C15.6091603,46.5270229 14.6564885,44.2381679 14.6564885,41.5658015 C14.6564885,38.8934351 15.6091603,36.5850382 17.5193893,34.6381679 C19.4271756,32.6912977 21.7160305,31.7166412 24.3883969,31.7166412 C25.9932824,31.7166412 27.6323664,32.1758779 29.3129771,33.0919084 L29.3129771,7.32824427 Z" id="Fill-2" fill="#E91E63"></path>
</g>
</g>
<g id="Group-2" transform="translate(411.603053, 1.221374)">
<g id="Group-3">
<g id="Rectangle-1196">
<use fill="black" fill-opacity="1" filter="url(#filter-16)" xlink:href="#path-15"></use>
<use fill="#FFFFFF" fill-rule="evenodd" xlink:href="#path-15"></use>
</g>
<polygon id="Fill-1" points="9.77099237 68.3969466 68.3969466 68.3969466 68.3969466 9.77099237 9.77099237 9.77099237"></polygon>
</g>
<g id="filetype_book" transform="translate(9.770992, 9.770992)">
<polygon id="Fill-1" points="0 58.6259542 58.6259542 58.6259542 58.6259542 0 0 0"></polygon>
<path d="M14.6564885,9.77099237 L26.870229,9.77099237 L26.870229,29.3129771 L20.7633588,25.648855 L14.6564885,29.3129771 L14.6564885,9.77099237 Z M43.9694656,4.88549618 L14.6564885,4.88549618 C11.9572519,4.88549618 9.77099237,7.07175573 9.77099237,9.77099237 L9.77099237,48.8549618 C9.77099237,51.5541985 11.9572519,53.740458 14.6564885,53.740458 L43.9694656,53.740458 C46.6687023,53.740458 48.8549618,51.5541985 48.8549618,48.8549618 L48.8549618,9.77099237 C48.8549618,7.07175573 46.6687023,4.88549618 43.9694656,4.88549618 L43.9694656,4.88549618 Z" id="Fill-2" fill="#FF6D40"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st12" d="M20.5,5.2l-1.4-1.7C18.9,3.2,18.5,3,18,3H6C5.5,3,5.1,3.2,4.8,3.5L3.5,5.2C3.2,5.6,3,6,3,6.5V19
c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V6.5C21,6,20.8,5.6,20.5,5.2z M17,11h-2v2h2v2h-2v2h2v2h-2v-2h-2v-2h2v-2h-2v-2h2V9h-2V7h2v2
h2V11z M5.1,5l0.8-1h12l0.9,1H5.1z"/>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_24_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_22_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st15" d="M12,3v9.3c-0.5-0.2-1-0.3-1.5-0.3C8,12,6,14,6,16.5S8,21,10.5,21c2.3,0,4.2-1.8,4.4-4H15V6h4V3H12z"/>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_32_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_30_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st12" d="M2,20h20v-4H2V20z M4,17h2v2H4V17z M2,4v4h20V4H2z M6,7H4V5h2V7z M2,14h20v-4H2V14z M4,11h2v2H4V11z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_68_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_48_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st11" d="M19,4H5C4.5,4,4,4.5,4,5v14c0,0.5,0.5,1,1,1h14c0.6,0,1-0.5,1-1V5C20,4.5,19.6,4,19,4z M13,15H7v-1h6V15z
M17,13H7v-1h10V13z M17,11H7v-1h10V11z M17,9H7V8h10V9z"/>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_80_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_60_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st13" d="M18,2H6C4.9,2,4,2.9,4,4v16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V4C20,2.9,19.1,2,18,2z M6,4h5v8l-2.5-1.5
L6,12V4z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_66_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_46_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st9" d="M10,4H4C2.9,4,2,4.9,2,6l0,12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V8c0-1.1-0.9-2-2-2h-8L10,4z"/>
<path class="st0" d="M0,0h24v24H0V0z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_1_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_3_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><rect id="backgroundrect" width="100%" height="100%" x="0" y="0" fill="none" stroke="none" class="" style=""/>
<g class="currentLayer" style=""><title>Layer 1</title><path fill="#000" fill-opacity=".28" fill-rule="evenodd" d="M9.986754953861237,3.973509907722475 H3.986754953861237 C2.8867549538612365,3.973509907722475 1.986754953861237,4.8735099077224735 1.986754953861237,5.973509907722473 v12 c0,1.1 0.9,2 2,2 h16 c1.1,0 2,-0.9 2,-2 V7.973509907722473 c0,-1.1 -0.9,-2 -2,-2 h-8 L9.986754953861237,3.973509907722475 z" id="svg_1" class=""/></g></svg>

After

Width:  |  Height:  |  Size: 621 B

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st9" d="M20,6h-8l-2-2H4C2.9,4,2,4.9,2,6l0,12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V8C22,6.9,21.1,6,20,6z M20,18H4V8
h16V18z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_8_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_5_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st18" d="M18,4H6C4.9,4,4,4.9,4,6v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6C20,4.9,19.1,4,18,4z M9,16H7v-2h2V16z
M9,13H7v-2h2V13z M9,10H7V8h2V10z M17,16h-7v-2h7V16z M17,13h-7v-2h7V13z M17,10h-7V8h7V10z"/>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_74_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_54_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
<g>
<path class="st11" d="M16,2H6C4.9,2,4,2.9,4,4l0,16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6L16,2z M13,17H7v-1h6V17z M17,15H7v-1
h10V15z M17,13H7v-1h10V13z M17,11H7v-1h10V11z"/>
<path class="st16" d="M16,6V2l4,4H16z"/>
<path class="st17" d="M20,6v4l-4-4H20z"/>
</g>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_112_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_92_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<g>
<path class="st13" d="M16,2H6C4.9,2,4,2.9,4,4l0,16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6L16,2z M7,12.5C7,10.6,8.6,9,10.5,9
s3.5,1.6,3.5,3.5c0,0.2,0,0.3-0.1,0.5H11v2.9c-0.2,0-0.3,0.1-0.5,0.1C8.6,16,7,14.4,7,12.5z M17,19h-5v-5l5,0V19z"/>
<path class="st16" d="M16,6V2l4,4H16z"/>
<path class="st17" d="M20,6v4l-4-4H20z"/>
</g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_104_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_84_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
<g>
<path class="st18" d="M16,2H6C4.9,2,4,2.9,4,4l0,16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6L16,2z M9,18H7v-2h2V18z M9,15H7v-2h2
V15z M9,12H7v-2h2V12z M17,18h-7v-2h7V18z M17,15h-7v-2h7V15z M17,12h-7v-2h7V12z"/>
<path class="st16" d="M16,6V2l4,4H16z"/>
<path class="st17" d="M20,6v4l-4-4H20z"/>
</g>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_106_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_86_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1,148 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
<g>
<path class="st8" d="M6,2C4.9,2,4,2.9,4,4l0,16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6l-4-4H6z"/>
<path class="st6" d="M17,9L17,9L7,9v0h0v10h10L17,9L17,9z M10,13v2H8v-2H10z M8,12v-2h2v2H8z M11,13h5v2h-5V13z M11,12v-2h5v2H11
z M8,18v-2h2v2H8z M11,18v-2h5v2H11z"/>
<path class="st16" d="M16,6V2l4,4H16z"/>
<path class="st17" d="M20,6v4l-4-4H20z"/>
</g>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_110_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_90_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1,146 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
<g>
<path class="st14" d="M16,2H6C4.9,2,4,2.9,4,4l0,16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6L16,2z M17,17H7v-7h10V17z"/>
<path class="st16" d="M16,6V2l4,4H16z"/>
<path class="st17" d="M20,6v4l-4-4H20z"/>
</g>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_108_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_88_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st9" d="M6,2C4.9,2,4,2.9,4,4l0,16c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V8l-6-6H6z M13,9V3.5L18.5,9H13z"/>
<path class="st0" d="M0,0h24v24H0V0z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_28_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_26_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<g>
<path class="st8" d="M22,17.2c0-3.9,0-7.9,0-11.8c0-0.4,0-0.8-0.2-1.1C21.4,4,21,4.1,20.6,4c-2.3,0-4.5,0-6.8,0
c0-0.6,0-1.2,0-1.8h-1.3C9,2.8,5.5,3.4,2,4.1C2,9.4,2,14.7,2,20c3.5,0.6,6.9,1.2,10.4,1.8h1.4c0-0.7,0-1.4,0-2c2.4,0,4.7,0,7.1,0
c0.4,0,0.9,0,1-0.5C22.1,18.6,22,17.9,22,17.2z M8.7,15.6c-0.4-0.9-0.9-1.9-1.1-2.9c-0.3,0.9-0.7,1.8-1.1,2.7c-0.5,0-1,0-1.5,0
c0.6-1.1,1.1-2.3,1.7-3.4c-0.5-1.2-1.1-2.3-1.6-3.5c0.5,0,1-0.1,1.5-0.1c0.3,0.9,0.7,1.8,1,2.7c0.3-1,0.7-1.9,1.1-2.8
c0.5,0,1-0.1,1.5-0.1c-0.6,1.2-1.2,2.5-1.8,3.7c0.6,1.3,1.3,2.5,1.9,3.8C9.8,15.6,9.2,15.6,8.7,15.6z M21.3,19c-2.5,0-5,0-7.5,0
c0-0.5,0-0.9,0-1.4c0.6,0,1.2,0,1.8,0c0-0.5,0-1.1,0-1.6c-0.6,0-1.2,0-1.8,0c0-0.3,0-0.6,0-0.9c0.6,0,1.2,0,1.8,0
c0-0.5,0-1.1,0-1.6c-0.6,0-1.2,0-1.8,0c0-0.3,0-0.6,0-0.9c0.6,0,1.2,0,1.8,0c0-0.5,0-1.1,0-1.6c-0.6,0-1.2,0-1.8,0
c0-0.3,0-0.6,0-0.9c0.6,0,1.2,0,1.8,0c0-0.5,0-1.1,0-1.6c-0.6,0-1.2,0-1.8,0c0-0.3,0-0.6,0-0.9c0.6,0,1.2,0,1.8,0
c0-0.5,0-1.1,0-1.6c-0.6,0-1.2,0-1.8,0c0-0.5,0-0.9,0-1.4c2.5,0,5,0,7.5,0C21.3,9.5,21.3,14.3,21.3,19z"/>
<path class="st8" d="M16.5,6.1c1.1,0,2.1,0,3.2,0c0,0.5,0,1.1,0,1.6c-1.1,0-2.1,0-3.2,0C16.5,7.2,16.5,6.6,16.5,6.1z"/>
<path class="st8" d="M16.5,8.6c1.1,0,2.1,0,3.2,0c0,0.5,0,1.1,0,1.6c-1.1,0-2.1,0-3.2,0C16.5,9.7,16.5,9.1,16.5,8.6z"/>
<path class="st8" d="M16.5,11.1c1.1,0,2.1,0,3.2,0c0,0.5,0,1.1,0,1.6c-1.1,0-2.1,0-3.2,0C16.5,12.2,16.5,11.6,16.5,11.1z"/>
<path class="st8" d="M16.5,13.6c1.1,0,2.1,0,3.2,0c0,0.5,0,1.1,0,1.6c-1.1,0-2.1,0-3.2,0C16.5,14.7,16.5,14.1,16.5,13.6z"/>
<path class="st8" d="M16.5,16.1c1.1,0,2.1,0,3.2,0c0,0.5,0,1.1,0,1.6c-1.1,0-2.1,0-3.2,0C16.5,17.2,16.5,16.6,16.5,16.1z"/>
</g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_118_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_98_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@@ -0,0 +1,152 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<g>
<path class="st14" d="M15.4,6.5c0,1,0,2,0,3c1,0,2,0,3,0C18.3,7.9,17,6.6,15.4,6.5z"/>
<path class="st14" d="M22,5.2c0.1-0.5-0.4-0.9-0.9-0.9c-2.4,0-4.9,0-7.3,0c0-0.7,0-1.4,0-2h-1.3C9,2.8,5.5,3.4,2,4.1
C2,9.4,2,14.7,2,20c3.5,0.6,6.9,1.2,10.4,1.8h1.4c0-0.8,0-1.5,0-2.3c2.3,0,4.5,0,6.8,0c0.4,0,0.8,0,1.2-0.2
c0.3-0.4,0.2-0.9,0.2-1.4C22,13.7,22,9.4,22,5.2z M8.7,12.8C8.1,13,7.6,13,7,13c0,0.9,0,1.8,0,2.7c-0.4,0-0.9-0.1-1.4-0.1
c0-2.4,0-4.9,0-7.3c1.2,0.1,2.7-0.5,3.8,0.4C10.4,9.9,10.1,12,8.7,12.8z M21.3,18.8c-2.5,0-5,0-7.5,0c0-0.6,0-1.2,0-1.8
c1.8,0,3.6,0,5.5,0c0-0.3,0-0.6,0-0.9c-1.8,0-3.6,0-5.5,0c0-0.4,0-0.8,0-1.1c1.8,0,3.6,0,5.5,0c0-0.3,0-0.6,0-0.9
c-1.8,0-3.6,0-5.5,0c0-0.4,0-0.9,0-1.3c0.9,0.3,1.9,0.3,2.7-0.3c0.9-0.5,1.3-1.5,1.4-2.5c-1,0-2,0-3,0c0-1,0-2,0-3
c-0.4,0.1-0.7,0.1-1.1,0.2c0-0.8,0-1.5,0-2.3c2.5,0,5,0,7.5,0C21.3,9.6,21.3,14.2,21.3,18.8z"/>
<path class="st14" d="M7,9.5c0,0.8,0,1.5,0,2.3c0.5-0.1,1,0,1.3-0.5c0.2-0.5,0.2-1,0-1.5C8,9.4,7.4,9.4,7,9.5z"/>
</g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_116_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_96_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st11" d="M22,4.9c0-0.5-0.4-0.9-0.9-0.9c-2.4,0-4.9,0-7.3,0c0-0.6,0-1.2,0-1.8h-1.4C9,2.8,5.5,3.4,2,4.1
C2,9.4,2,14.7,2,20c3.5,0.6,6.9,1.2,10.4,1.8h1.4c0-0.6,0-1.2,0-1.8c2.3,0,4.5,0,6.8,0c0.4,0,0.8,0,1.1-0.2
c0.3-0.4,0.2-0.9,0.2-1.4C22,13.9,22,9.4,22,4.9z M9.6,15.1c-0.4,0.2-0.9,0-1.4,0c-0.3-1.5-0.7-3-0.9-4.5C7,12.1,6.6,13.5,6.3,15
c-0.4,0-0.9,0-1.3-0.1c-0.4-2-0.8-4-1.2-6c0.4,0,0.8,0,1.2,0c0.2,1.4,0.5,2.9,0.7,4.3c0.3-1.5,0.6-3,1-4.5c0.4,0,0.9,0,1.3-0.1
c0.3,1.5,0.6,3.1,0.9,4.6c0.3-1.6,0.5-3.1,0.8-4.7c0.5,0,0.9,0,1.4-0.1C10.6,10.7,10.1,12.9,9.6,15.1z M21.3,19.3
c-2.5,0-5,0-7.5,0c0-0.6,0-1.2,0-1.8c2,0,3.9,0,5.9,0c0-0.3,0-0.6,0-0.9c-2,0-3.9,0-5.9,0c0-0.4,0-0.8,0-1.1c2,0,3.9,0,5.9,0
c0-0.3,0-0.6,0-0.9c-2,0-3.9,0-5.9,0c0-0.4,0-0.8,0-1.1c2,0,3.9,0,5.9,0c0-0.3,0-0.6,0-0.9c-2,0-3.9,0-5.9,0c0-0.4,0-0.8,0-1.1
c2,0,3.9,0,5.9,0c0-0.3,0-0.6,0-0.9c-2,0-3.9,0-5.9,0c0-0.4,0-0.8,0-1.1c2,0,3.9,0,5.9,0c0-0.3,0-0.6,0-0.9c-2,0-3.9,0-5.9,0
c0-0.4,0-0.8,0-1.1c2,0,3.9,0,5.9,0c0-0.3,0-0.6,0-0.9c-2,0-3.9,0-5.9,0c0-0.5,0-1.1,0-1.6c2.5,0,5,0,7.5,0
C21.3,9.6,21.3,14.4,21.3,19.3z"/>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_120_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_100_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<path class="st19" d="M19,3c0.5,0,1,0.2,1.4,0.6C20.8,4,21,4.4,21,5v14c0,0.5-0.2,1-0.6,1.4C20,20.8,19.6,21,19,21H5
c-0.5,0-1-0.2-1.4-0.6C3.2,20,3,19.5,3,19V5c0-0.5,0.2-1,0.6-1.4S4.5,3,5,3H19z M9.5,11.5v-1c0-0.4-0.1-0.8-0.4-1.1
C8.7,9.1,8.4,9,8,9H5.5v6H7v-2h1c0.4,0,0.8-0.1,1.1-0.4C9.3,12.3,9.5,11.9,9.5,11.5z M7,11.5h1v-1H7V11.5z M14.5,13.5v-3
c0-0.4-0.1-0.8-0.4-1.1C13.8,9.1,13.4,9,13,9h-2.5v6H13c0.4,0,0.8-0.1,1.1-0.4C14.4,14.2,14.5,13.9,14.5,13.5z M12,13.5h1v-3h-1
V13.5z M18.5,10.5V9h-3v6H17v-2h1.5v-1.5H17v-1H18.5z"/>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_62_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_42_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st14" d="M18,4H6C4.9,4,4,4.9,4,6v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6C20,4.9,19.1,4,18,4z M17,14H7V8h10V14z"/>
<rect x="0" y="0" class="st0" width="24" height="24"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_76_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_56_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st8" d="M21,19V5c0-1.1-0.9-2-2-2H5C3.9,3,3,3.9,3,5v14c0,1.1,0.9,2,2,2h14C20.1,21,21,20.1,21,19z M8.5,13.5l2.5,3
l3.5-4.5l4.5,6H5L8.5,13.5z"/>
<path class="st0" d="M0,0h24v24H0V0z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_64_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_44_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,4 @@
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0z" fill="none"/>
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>
</svg>

After

Width:  |  Height:  |  Size: 281 B

View File

@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
<g>
<rect x="8" y="14" class="st8" width="2" height="2"/>
<rect x="11" y="14" class="st8" width="5" height="2"/>
<rect x="8" y="11" class="st8" width="2" height="2"/>
<rect x="8" y="8" class="st8" width="2" height="2"/>
<path class="st8" d="M19,4H5C4.5,4,4,4.5,4,5v14c0,0.5,0.5,1,1,1h14c0.6,0,1-0.5,1-1V5C20,4.5,19.6,4,19,4z M17,17H7V7h0v0h10v0
h0V17z"/>
<rect x="11" y="8" class="st8" width="5" height="2"/>
<rect x="11" y="11" class="st8" width="5" height="2"/>
</g>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_78_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_58_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<rect x="0" y="0" class="st0" width="24" height="24"/>
<path class="st13" d="M18,4H6C4.9,4,4,4.9,4,6v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V6C20,4.9,19.1,4,18,4z M7,10.5
C7,8.6,8.6,7,10.5,7S14,8.6,14,10.5c0,0.2,0,0.3-0.1,0.5H11v2.9c-0.2,0-0.3,0.1-0.5,0.1C8.6,14,7,12.4,7,10.5z M17,17h-5v-5l5,0
V17z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_72_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_52_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<rect x="0" class="st0" width="24" height="24"/>
<path class="st14" d="M18,3v2h-2V3H8v2H6V3H4v18h2v-2h2v2h8v-2h2v2h2V3H18z M8,17H6v-2h2V17z M8,13H6v-2h2V13z M8,9H6V7h2V9z
M18,17h-2v-2h2V17z M18,13h-2v-2h2V13z M18,9h-2V7h2V9z"/>
<path class="st0" d="M0,0h24v24H0V0z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_36_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_34_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24px"
height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{clip-path:url(#SVGID_2_);}
.st2{fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st3{opacity:0.4;}
.st4{clip-path:url(#SVGID_4_);fill:none;stroke:#000000;stroke-width:0.25;stroke-miterlimit:10;}
.st5{clip-path:url(#SVGID_4_);}
.st6{fill:#FFFFFF;}
.st7{fill:none;stroke:#000000;stroke-width:3;stroke-miterlimit:10;}
.st8{fill:#22BE73;}
.st9{fill:#D9E021;}
.st10{fill-rule:evenodd;clip-rule:evenodd;}
.st11{fill:#2979FF;}
.st12{fill:#00B0FF;}
.st13{fill:#FF6D40;}
.st14{fill:#FFC107;}
.st15{fill:#E91E63;}
.st16{opacity:0.5;fill:#FFFFFF;}
.st17{opacity:0.2;}
.st18{fill:#651FFF;}
.st19{fill-rule:evenodd;clip-rule:evenodd;fill:#E91E63;}
.st20{display:none;}
</style>
<symbol id="material_x5F_system_x5F_icon_x5F_border" viewBox="0 -48 48 48">
<rect y="-48" class="st0" width="48" height="48"/>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_grid" viewBox="0 -48 48 48">
<g>
<defs>
<rect id="SVGID_1_" x="0" y="-48" width="48" height="48"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g class="st1">
<g>
<line class="st2" x1="2" y1="-48" x2="2" y2="0"/>
<line class="st2" x1="4" y1="-48" x2="4" y2="0"/>
<line class="st2" x1="6" y1="-48" x2="6" y2="0"/>
<line class="st2" x1="8" y1="-48" x2="8" y2="0"/>
<line class="st2" x1="10" y1="-48" x2="10" y2="0"/>
<line class="st2" x1="12" y1="-48" x2="12" y2="0"/>
<line class="st2" x1="14" y1="-48" x2="14" y2="0"/>
<line class="st2" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st2" x1="18" y1="-48" x2="18" y2="0"/>
<line class="st2" x1="20" y1="-48" x2="20" y2="0"/>
<line class="st2" x1="22" y1="-48" x2="22" y2="0"/>
<line class="st2" x1="24" y1="-48" x2="24" y2="0"/>
<line class="st2" x1="26" y1="-48" x2="26" y2="0"/>
<line class="st2" x1="28" y1="-48" x2="28" y2="0"/>
<line class="st2" x1="30" y1="-48" x2="30" y2="0"/>
<line class="st2" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st2" x1="34" y1="-48" x2="34" y2="0"/>
<line class="st2" x1="36" y1="-48" x2="36" y2="0"/>
<line class="st2" x1="38" y1="-48" x2="38" y2="0"/>
<line class="st2" x1="40" y1="-48" x2="40" y2="0"/>
<line class="st2" x1="42" y1="-48" x2="42" y2="0"/>
<line class="st2" x1="44" y1="-48" x2="44" y2="0"/>
<line class="st2" x1="46" y1="-48" x2="46" y2="0"/>
</g>
<g>
<line class="st2" x1="0" y1="-2" x2="48" y2="-2"/>
<line class="st2" x1="0" y1="-4" x2="48" y2="-4"/>
<line class="st2" x1="0" y1="-6" x2="48" y2="-6"/>
<line class="st2" x1="0" y1="-8" x2="48" y2="-8"/>
<line class="st2" x1="0" y1="-10" x2="48" y2="-10"/>
<line class="st2" x1="0" y1="-12" x2="48" y2="-12"/>
<line class="st2" x1="0" y1="-14" x2="48" y2="-14"/>
<line class="st2" x1="0" y1="-16" x2="48" y2="-16"/>
<line class="st2" x1="0" y1="-18" x2="48" y2="-18"/>
<line class="st2" x1="0" y1="-20" x2="48" y2="-20"/>
<line class="st2" x1="0" y1="-22" x2="48" y2="-22"/>
<line class="st2" x1="0" y1="-24" x2="48" y2="-24"/>
<line class="st2" x1="0" y1="-26" x2="48" y2="-26"/>
<line class="st2" x1="0" y1="-28" x2="48" y2="-28"/>
<line class="st2" x1="0" y1="-30" x2="48" y2="-30"/>
<line class="st2" x1="0" y1="-32" x2="48" y2="-32"/>
<line class="st2" x1="0" y1="-34" x2="48" y2="-34"/>
<line class="st2" x1="0" y1="-36" x2="48" y2="-36"/>
<line class="st2" x1="0" y1="-38" x2="48" y2="-38"/>
<line class="st2" x1="0" y1="-40" x2="48" y2="-40"/>
<line class="st2" x1="0" y1="-42" x2="48" y2="-42"/>
<line class="st2" x1="0" y1="-44" x2="48" y2="-44"/>
<line class="st2" x1="0" y1="-46" x2="48" y2="-46"/>
</g>
<g>
<path d="M47.8-0.2v-47.5H0.2v47.5H47.8 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</g>
</symbol>
<symbol id="material_x5F_system_x5F_icon_x5F_keylines" viewBox="0 -48 48 48">
<g class="st3">
<defs>
<rect id="SVGID_3_" x="0" y="-48" class="st3" width="48" height="48"/>
</defs>
<clipPath id="SVGID_4_">
<use xlink:href="#SVGID_3_" style="overflow:visible;"/>
</clipPath>
<line class="st4" x1="24" y1="0" x2="24" y2="-48"/>
<line class="st4" x1="48" y1="-24" x2="0" y2="-24"/>
<line class="st4" x1="48" y1="-16" x2="0" y2="-16"/>
<line class="st4" x1="48" y1="-32" x2="0" y2="-32"/>
<line class="st4" x1="32" y1="-48" x2="32" y2="0"/>
<line class="st4" x1="16" y1="-48" x2="16" y2="0"/>
<line class="st4" x1="47.7" y1="-0.3" x2="0.2" y2="-47.8"/>
<line class="st4" x1="0.2" y1="-0.3" x2="47.7" y2="-47.8"/>
<path class="st4" d="M24-14c-5.5,0-10-4.5-10-10c0-5.5,4.5-10,10-10c5.5,0,10,4.5,10,10C34-18.5,29.5-14,24-14z"/>
<path class="st4" d="M24-4C12.9-4,4-12.9,4-24c0-11.1,8.9-20,20-20c11.1,0,20,8.9,20,20C44-12.9,35.1-4,24-4z"/>
<path class="st4" d="M38-6H10c-2.2,0-4-1.8-4-4v-28c0-2.2,1.8-4,4-4h28c2.2,0,4,1.8,4,4v28C42-7.8,40.2-6,38-6z"/>
<path class="st4" d="M40-8H8c-2.2,0-4-1.8-4-4v-24c0-2.2,1.8-4,4-4h32c2.2,0,4,1.8,4,4l0,24C44-9.8,42.2-8,40-8z"/>
<path class="st4" d="M40-40v32c0,2.2-1.8,4-4,4H12C9.8-4,8-5.8,8-8v-32c0-2.2,1.8-4,4-4h24C38.2-44,40-42.2,40-40z"/>
<g class="st5">
<path d="M47.7-0.3v-47.5H0.2v47.5H47.7 M48,0H0v-48h48V0L48,0z"/>
</g>
</g>
</symbol>
<g id="label">
</g>
<g id="border">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_border" width="48" height="48" y="-48" transform="matrix(0.5 0 0 -0.5 3.916831e-04 5.698877e-05)" style="overflow:visible;"/>
</g>
<g id="icon">
<g>
<path class="st0" d="M0,0h24v24H0V0z"/>
<path class="st11" d="M9.4,16.6L4.8,12l4.6-4.6L8,6l-6,6l6,6L9.4,16.6z M14.6,16.6l4.6-4.6l-4.6-4.6L16,6l6,6l-6,6L14.6,16.6z"/>
</g>
</g>
<g id="grid" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_grid" width="48" height="48" id="XMLID_70_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.139775e-04 -2.620241e-04)" style="display:inline;overflow:visible;opacity:0.15;"/>
</g>
<g id="keylines" class="st20">
<use xlink:href="#material_x5F_system_x5F_icon_x5F_keylines" width="48" height="48" id="XMLID_50_" x="0" y="-48" transform="matrix(0.5 0 0 -0.5 1.709663e-04 -2.924798e-04)" style="display:inline;overflow:visible;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,25 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Directive, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[adf-card-view-content-proxy]'
})
export class CardViewContentProxyDirective {
constructor(public viewContainerRef: ViewContainerRef) { }
}

View File

@@ -0,0 +1,30 @@
<div class="adf-property-label">{{ property.label | translate }}</div>
<div class="adf-property-value">
<span *ngIf="!isEditable()">
<span [attr.data-automation-id]="'card-dateitem-' + property.key">
<span *ngIf="!property.isEmpty(); else elseEmptyValueBlock">{{ property.displayValue }}</span>
</span>
</span>
<span *ngIf="isEditable()" class="adf-dateitem-editable">
<input class="adf-invisible-date-input" [matDatepicker]="picker" [value]="valueDate"
(dateChange)="onDateChanged($event)">
<span
class="adf-datepicker-toggle"
[attr.data-automation-id]="'datepicker-label-toggle-' + property.key"
(click)="showDatePicker($event)">
<span *ngIf="!property.isEmpty(); else elseEmptyValueBlock">{{ property.displayValue }}</span>
</span>
<mat-datepicker-toggle
[attr.data-automation-id]="'datepickertoggle-' + property.key"
[for]="picker">
</mat-datepicker-toggle>
<mat-datepicker #picker
[attr.data-automation-id]="'datepicker-' + property.key"
[startAt]="valueDate"
[touchUi]="true">
</mat-datepicker>
</span>
<ng-template #elseEmptyValueBlock>
{{ property.default | translate }}
</ng-template>
</div>

View File

@@ -0,0 +1,36 @@
@mixin adf-card-view-dateitem-theme($theme) {
.adf {
&-invisible-date-input {
height: 24px;
width: 0;
overflow: hidden;
opacity: 0;
border: none;
margin: 0;
padding: 0;
display: none;
}
&-dateitem-editable {
cursor: pointer;
button.mat-icon-button {
line-height: 20px;
height: 20px;
width: 20px;
}
mat-icon {
width: 16px;
height: 16px;
opacity: 0.5;
margin-left: 4px;
}
&:hover mat-icon {
opacity: 1;
}
}
}
}

View File

@@ -0,0 +1,193 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { HttpClientModule } from '@angular/common/http';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MatDatepickerModule, MatInputModule, MatNativeDateModule } from '@angular/material';
import { By } from '@angular/platform-browser';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import * as moment from 'moment';
import { AppConfigService } from '../index';
import { CardViewDateItemModel } from '../models/card-view-dateitem.model';
import { CardViewUpdateService } from '../services/card-view-update.service';
import { TranslateLoaderService } from '../services/translate-loader.service';
import { CardViewDateItemComponent } from './card-view-dateitem.component';
describe('CardViewDateItemComponent', () => {
let fixture: ComponentFixture<CardViewDateItemComponent>;
let component: CardViewDateItemComponent;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
HttpClientModule,
MatDatepickerModule,
MatInputModule,
MatNativeDateModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateLoaderService
}
})
],
declarations: [
CardViewDateItemComponent
],
providers: [
CardViewUpdateService,
AppConfigService
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CardViewDateItemComponent);
component = fixture.componentInstance;
component.property = new CardViewDateItemModel({
label: 'Date label',
value: new Date('07/10/2017'),
key: 'datekey',
default: '',
format: '',
editable: false
});
});
afterEach(() => {
fixture.destroy();
TestBed.resetTestingModule();
});
it('should render the label and value', () => {
fixture.detectChanges();
let labelValue = fixture.debugElement.query(By.css('.adf-property-label'));
expect(labelValue).not.toBeNull();
expect(labelValue.nativeElement.innerText).toBe('Date label');
let value = fixture.debugElement.query(By.css('.adf-property-value'));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('Jul 10 2017');
});
it('should render the default as value if the value is empty and editable:false', () => {
component.property = new CardViewDateItemModel ({
label: 'Date label',
value: '',
key: 'datekey',
default: 'FAKE-DEFAULT-KEY',
format: '',
editable: false
});
fixture.detectChanges();
let value = fixture.debugElement.query(By.css('.adf-property-value'));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('FAKE-DEFAULT-KEY');
});
it('should render the default as value if the value is empty and editable:true', () => {
component.property = new CardViewDateItemModel ({
label: 'Date label',
value: '',
key: 'datekey',
default: 'FAKE-DEFAULT-KEY',
format: '',
editable: true
});
fixture.detectChanges();
let value = fixture.debugElement.query(By.css('.adf-property-value'));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('FAKE-DEFAULT-KEY');
});
it('should render value when editable:true', () => {
component.editable = true;
component.property.editable = true;
fixture.detectChanges();
let value = fixture.debugElement.query(By.css('.adf-property-value'));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('Jul 10 2017');
});
it('should render the picker and toggle in case of editable:true', () => {
component.editable = true;
component.property.editable = true;
fixture.detectChanges();
let datePicker = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-${component.property.key}"]`));
let datePickerToggle = fixture.debugElement.query(By.css(`[data-automation-id="datepickertoggle-${component.property.key}"]`));
expect(datePicker).not.toBeNull('Datepicker should be in DOM');
expect(datePickerToggle).not.toBeNull('Datepicker toggle should be shown');
});
it('should NOT render the picker and toggle in case of editable:false', () => {
component.property.editable = false;
fixture.detectChanges();
let datePicker = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-${component.property.key}"]`));
let datePickerToggle = fixture.debugElement.query(By.css(`[data-automation-id="datepickertoggle-${component.property.key}"]`));
expect(datePicker).toBeNull('Datepicker should NOT be in DOM');
expect(datePickerToggle).toBeNull('Datepicker toggle should NOT be shown');
});
it('should NOT render the picker and toggle in case of editable:true but (general) editable:false', () => {
component.editable = false;
component.property.editable = true;
fixture.detectChanges();
let datePicker = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-${component.property.key}"]`));
let datePickerToggle = fixture.debugElement.query(By.css(`[data-automation-id="datepickertoggle-${component.property.key}"]`));
expect(datePicker).toBeNull('Datepicker should NOT be in DOM');
expect(datePickerToggle).toBeNull('Datepicker toggle should NOT be shown');
});
it('should open the datetimepicker when clicking on the label', () => {
component.editable = true;
component.property.editable = true;
fixture.detectChanges();
spyOn(component.datepicker, 'open');
let datePickerLabelToggle = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-label-toggle-${component.property.key}"]`));
datePickerLabelToggle.triggerEventHandler('click', {});
expect(component.datepicker.open).toHaveBeenCalled();
});
it('should trigger an update event on the CardViewUpdateService', (done) => {
component.editable = true;
component.property.editable = true;
const cardViewUpdateService = TestBed.get(CardViewUpdateService);
const expectedDate = moment('Jul 10 2017', 'MMM DD YY');
fixture.detectChanges();
cardViewUpdateService.itemUpdated$.subscribe(
(updateNotification) => {
expect(updateNotification.target).toBe(component.property);
expect(updateNotification.changed).toEqual({datekey: expectedDate.toDate()});
done();
}
);
component.onDateChanged({value: expectedDate});
});
});

View File

@@ -0,0 +1,88 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Component, Input, OnInit, ViewChild } from '@angular/core';
import { MatDatepicker } from '@angular/material';
import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material';
import * as moment from 'moment';
import { Moment } from 'moment';
import { CardViewDateItemModel } from '../models/card-view-dateitem.model';
import { CardViewUpdateService } from '../services/card-view-update.service';
import { UserPreferencesService } from '../services/user-preferences.service';
import { MOMENT_DATE_FORMATS, MomentDateAdapter } from '../utils/momentDateAdapter';
@Component({
providers: [
{provide: DateAdapter, useClass: MomentDateAdapter},
{provide: MAT_DATE_FORMATS, useValue: MOMENT_DATE_FORMATS}],
selector: 'adf-card-view-dateitem',
templateUrl: './card-view-dateitem.component.html',
styleUrls: ['./card-view-dateitem.component.scss']
})
export class CardViewDateItemComponent implements OnInit {
public SHOW_FORMAT: string = 'MMM DD YY';
@Input()
property: CardViewDateItemModel;
@Input()
editable: boolean;
@ViewChild(MatDatepicker)
public datepicker: MatDatepicker<any>;
valueDate: Moment;
constructor(
private cardViewUpdateService: CardViewUpdateService,
private dateAdapter: DateAdapter<Moment>,
private preferences: UserPreferencesService) {
}
ngOnInit() {
this.preferences.locale$.subscribe( (locale) => {
this.dateAdapter.setLocale(locale);
});
let momentDateAdapter = <MomentDateAdapter> this.dateAdapter;
momentDateAdapter.overrideDisplyaFormat = this.SHOW_FORMAT;
if (this.property.value) {
this.valueDate = moment(this.property.value, this.SHOW_FORMAT);
}
}
isEditable() {
return this.editable && this.property.editable;
}
showDatePicker() {
this.datepicker.open();
}
onDateChanged(newDateValue) {
if (newDateValue) {
let momentDate = moment(newDateValue.value, this.SHOW_FORMAT, true);
if (momentDate.isValid()) {
this.valueDate = momentDate;
this.cardViewUpdateService.update(this.property, {[this.property.key]: momentDate.toDate()});
}
}
}
}

View File

@@ -0,0 +1,162 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
/* tslint:disable:component-selector */
import { Component, Input } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing';
import { CardViewItem } from '../interface/card-view-item.interface';
import { CardItemTypeService } from '../services/card-item-types.service';
import { CardViewContentProxyDirective } from './card-view-content-proxy.directive';
import { CardViewItemDispatcherComponent } from './card-view-item-dispatcher.component';
@Component({
selector: 'whatever-you-want-to-have',
template: '<div data-automation-id="found-me">Hey I am shiny!</div>'
})
export class CardViewShinyCustomElementItemComponent {
@Input() property: CardViewItem;
@Input() editable: boolean;
}
describe('CardViewItemDispatcherComponent', () => {
let fixture: ComponentFixture<CardViewItemDispatcherComponent>;
let cardItemTypeService: CardItemTypeService;
let component: CardViewItemDispatcherComponent;
beforeEach(async(() => {
cardItemTypeService = new CardItemTypeService();
cardItemTypeService.setComponentTypeResolver('shiny-custom-element', () => CardViewShinyCustomElementItemComponent);
TestBed.configureTestingModule({
imports: [],
declarations: [
CardViewItemDispatcherComponent,
CardViewShinyCustomElementItemComponent,
CardViewContentProxyDirective
],
providers: [ { provide: CardItemTypeService, useValue: cardItemTypeService } ]
});
// entryComponents are not supported yet on TestBed, that is why this ugly workaround:
// https://github.com/angular/angular/issues/10760
TestBed.overrideModule(BrowserDynamicTestingModule, {
set: { entryComponents: [ CardViewShinyCustomElementItemComponent ] }
});
TestBed.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CardViewItemDispatcherComponent);
component = fixture.componentInstance;
component.property = <CardViewItem> {
type: 'shiny-custom-element',
label: 'Shiny custom element',
value: null,
key: 'customkey',
default: '',
editable: false,
get displayValue(): string {
return 'custom value displayed';
}
};
component.editable = true;
fixture.detectChanges();
component.ngOnChanges(null);
});
afterEach(() => {
fixture.destroy();
TestBed.resetTestingModule();
});
describe('Subcompomnent creation', () => {
it('should load the CardViewShinyCustomElementItemComponent', () => {
const innerElement = fixture.debugElement.query(By.css('[data-automation-id="found-me"]'));
expect(innerElement).not.toBeNull();
});
it('should load the CardViewShinyCustomElementItemComponent only ONCE', () => {
component.ngOnChanges();
component.ngOnChanges();
component.ngOnChanges();
fixture.detectChanges();
const shinyCustomElementItemComponent = fixture.debugElement.queryAll(By.css('whatever-you-want-to-have'));
expect(shinyCustomElementItemComponent.length).toEqual(1);
});
it('should pass through the property and editable parameters', () => {
const shinyCustomElementItemComponent = fixture.debugElement.query(By.css('whatever-you-want-to-have')).componentInstance;
expect(shinyCustomElementItemComponent.property).toBe(component.property);
expect(shinyCustomElementItemComponent.editable).toBe(component.editable);
});
});
describe('Angular lifecycle methods', () => {
let shinyCustomElementItemComponent;
const lifeCycleMethods = [
'ngOnChanges',
'ngOnInit',
'ngDoCheck',
'ngAfterContentInit',
'ngAfterContentChecked',
'ngAfterViewInit',
'ngAfterViewChecked',
'ngOnDestroy'
];
beforeEach(() => {
shinyCustomElementItemComponent = fixture.debugElement.query(By.css('whatever-you-want-to-have')).componentInstance;
});
it('should call through the lifecycle methods', () => {
lifeCycleMethods.forEach((lifeCycleMethod) => {
shinyCustomElementItemComponent[lifeCycleMethod] = () => {};
spyOn(shinyCustomElementItemComponent, lifeCycleMethod);
const param1 = {};
const param2 = {};
component[lifeCycleMethod].call(component, param1, param2);
expect(shinyCustomElementItemComponent[lifeCycleMethod]).toHaveBeenCalledWith(param1, param2);
});
});
it('should NOT call through the lifecycle methods if the method does not exist (no error should be thrown)', () => {
lifeCycleMethods.forEach((lifeCycleMethod) => {
shinyCustomElementItemComponent[lifeCycleMethod] = undefined;
const execution = () => {
component[lifeCycleMethod].call(component);
};
expect(execution).not.toThrowError();
});
});
});
});

View File

@@ -0,0 +1,90 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 {
Component,
ComponentFactoryResolver,
Input,
OnChanges,
ViewChild
} from '@angular/core';
import { CardViewItem } from '../interface/card-view-item.interface';
import { CardItemTypeService } from '../services/card-item-types.service';
import { CardViewContentProxyDirective } from './card-view-content-proxy.directive';
@Component({
selector: 'adf-card-view-item-dispatcher',
template: '<ng-template adf-card-view-content-proxy></ng-template>'
})
export class CardViewItemDispatcherComponent implements OnChanges {
@Input()
property: CardViewItem;
@Input()
editable: boolean;
@ViewChild(CardViewContentProxyDirective)
private content: CardViewContentProxyDirective;
private loaded: boolean = false;
private componentReference: any = null;
public ngOnInit;
public ngDoCheck;
constructor(private cardItemTypeService: CardItemTypeService,
private resolver: ComponentFactoryResolver) {
const dynamicLifecycleMethods = [
'ngOnInit',
'ngDoCheck',
'ngAfterContentInit',
'ngAfterContentChecked',
'ngAfterViewInit',
'ngAfterViewChecked',
'ngOnDestroy'
];
dynamicLifecycleMethods.forEach((dynamicLifecycleMethod) => {
this[dynamicLifecycleMethod] = this.proxy.bind(this, dynamicLifecycleMethod);
});
}
ngOnChanges(...args) {
if (!this.loaded) {
this.loadComponent();
this.loaded = true;
}
this.proxy('ngOnChanges', ...args);
}
private loadComponent() {
const factoryClass = this.cardItemTypeService.resolveComponentType(this.property);
const factory = this.resolver.resolveComponentFactory(factoryClass);
this.componentReference = this.content.viewContainerRef.createComponent(factory);
this.componentReference.instance.editable = this.editable;
this.componentReference.instance.property = this.property;
}
private proxy(methodName, ...args) {
if (this.componentReference.instance[methodName]) {
this.componentReference.instance[methodName].apply(this.componentReference.instance, args);
}
}
}

View File

@@ -0,0 +1,16 @@
<div class="adf-property-label">{{ property.label | translate }}</div>
<div class="adf-property-value">
<div>
<span *ngIf="!isClickable(); else elseBlock" [attr.data-automation-id]="'card-mapitem-value-' + property.key">
<span *ngIf="!property.isEmpty(); else elseEmptyValueBlock">{{ property.displayValue }}</span>
</span>
<ng-template #elseBlock>
<span class="adf-mapitem-clickable-value" (click)="clicked()" [attr.data-automation-id]="'card-mapitem-value-' + property.key">
<span *ngIf="!property.isEmpty(); else elseEmptyValueBlock">{{ property.displayValue }}</span>
</span>
</ng-template>
</div>
<ng-template #elseEmptyValueBlock>
{{ property.default | translate }}
</ng-template>
</div>

View File

@@ -0,0 +1,5 @@
.adf {
&-mapitem-clickable-value {
cursor: pointer;
}
}

View File

@@ -0,0 +1,141 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { HttpClientModule } from '@angular/common/http';
import { DebugElement } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { MaterialModule } from '../material.module';
import { By } from '@angular/platform-browser';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { CardViewMapItemModel } from '../models/card-view-mapitem.model';
import { AppConfigService } from '../app-config/app-config.service';
import { CardViewUpdateService } from '../services/card-view-update.service';
import { LogService } from '../services/log.service';
import { TranslateLoaderService } from '../services/translate-loader.service';
import { CardViewMapItemComponent } from './card-view-mapitem.component';
describe('CardViewMapItemComponent', () => {
let service: CardViewUpdateService;
let fixture: ComponentFixture<CardViewMapItemComponent>;
let component: CardViewMapItemComponent;
let debug: DebugElement;
let element: HTMLElement;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
HttpClientModule,
FormsModule,
NoopAnimationsModule,
MaterialModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateLoaderService
}
})
],
declarations: [
CardViewMapItemComponent
],
providers: [
AppConfigService,
CardViewUpdateService,
LogService
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CardViewMapItemComponent);
service = TestBed.get(CardViewUpdateService);
component = fixture.componentInstance;
debug = fixture.debugElement;
element = fixture.nativeElement;
});
afterEach(() => {
fixture.destroy();
TestBed.resetTestingModule();
});
it('should render the default if the value is empty', () => {
component.property = new CardViewMapItemModel({
label: 'Map label',
value: null,
key: 'mapkey',
default: 'Fake default'
});
fixture.detectChanges();
let labelValue = debug.query(By.css('.adf-property-label'));
expect(labelValue).not.toBeNull();
expect(labelValue.nativeElement.innerText).toBe('Map label');
let value = debug.query(By.css(`[data-automation-id="card-mapitem-value-${component.property.key}"]`));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('Fake default');
});
it('should render the label and value', () => {
component.property = new CardViewMapItemModel({
label: 'Map label',
value: new Map([['999', 'fakeProcessName']]),
key: 'mapkey',
default: ''
});
fixture.detectChanges();
let labelValue = debug.query(By.css('.adf-property-label'));
expect(labelValue).not.toBeNull();
expect(labelValue.nativeElement.innerText).toBe('Map label');
let value = debug.query(By.css(`[data-automation-id="card-mapitem-value-${component.property.key}"]`));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('fakeProcessName');
});
it('should render a clickable value', (done) => {
component.property = new CardViewMapItemModel({
label: 'Map label',
value: new Map([['999', 'fakeProcessName']]),
key: 'mapkey',
default: 'Fake default',
clickable: true
});
fixture.detectChanges();
let value: any = element.querySelector('.adf-mapitem-clickable-value');
service.itemClicked$.subscribe((response) => {
expect(response.target).not.toBeNull();
expect(response.target.type).toEqual('map');
expect(response.target.clickable).toBeTruthy();
expect(response.target.displayValue).toEqual('fakeProcessName');
done();
});
value.click();
});
});

View File

@@ -0,0 +1,41 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Component, Input } from '@angular/core';
import { CardViewMapItemModel } from '../models/card-view-mapitem.model';
import { CardViewUpdateService } from '../services/card-view-update.service';
@Component({
selector: 'adf-card-view-mapitem',
templateUrl: './card-view-mapitem.component.html',
styleUrls: ['./card-view-mapitem.component.scss']
})
export class CardViewMapItemComponent {
@Input()
property: CardViewMapItemModel;
constructor(private cardViewUpdateService: CardViewUpdateService) {}
isClickable() {
return this.property.clickable;
}
clicked(): void {
this.cardViewUpdateService.clicked(this.property);
}
}

View File

@@ -0,0 +1,51 @@
<div class="adf-property-label">{{ property.label | translate }}</div>
<div class="adf-property-value">
<span *ngIf="!isEditble()">
<span *ngIf="!isClickable(); else elseBlock" [attr.data-automation-id]="'card-textitem-value-' + property.key">
<span *ngIf="!property.isEmpty(); else elseEmptyValueBlock">{{ property.displayValue }}</span>
</span>
<ng-template #elseBlock>
<span class="adf-textitem-clickable-value" (click)="clicked()" [attr.data-automation-id]="'card-textitem-value-' + property.key">
<span *ngIf="!property.isEmpty(); else elseEmptyValueBlock">{{ property.displayValue }}</span>
</span>
</ng-template>
</span>
<span *ngIf="isEditble()">
<div *ngIf="!inEdit" (click)="setEditMode(true)" class="adf-textitem-readonly" [attr.data-automation-id]="'card-textitem-edit-toggle-' + property.key">
<span [attr.data-automation-id]="'card-textitem-value-' + property.key">
<span *ngIf="!property.isEmpty(); else elseEmptyValueBlock">{{ property.displayValue }}</span>
</span>
<mat-icon [attr.data-automation-id]="'card-textitem-edit-icon-' + property.key" class="adf-textitem-icon">create</mat-icon>
</div>
<div *ngIf="inEdit" class="adf-textitem-editable">
<mat-form-field floatPlaceholder="never" class="adf-input-container">
<input *ngIf="!property.multiline" #editorInput
matInput
class="adf-input"
[placeholder]="property.default | translate"
[(ngModel)]="editedValue"
[attr.data-automation-id]="'card-textitem-editinput-' + property.key">
<textarea *ngIf="property.multiline" #editorInput
matInput
matTextareaAutosize
matAutosizeMaxRows="1"
matAutosizeMaxRows="5"
class="adf-textarea"
[placeholder]="property.default | translate"
[(ngModel)]="editedValue"
[attr.data-automation-id]="'card-textitem-edittextarea-' + property.key"></textarea>
</mat-form-field>
<mat-icon
class="adf-textitem-icon adf-update-icon"
(click)="update()"
[attr.data-automation-id]="'card-textitem-update-' + property.key">done</mat-icon>
<mat-icon
class="adf-textitem-icon adf-reset-icon"
(click)="reset()"
[attr.data-automation-id]="'card-textitem-reset-' + property.key">clear</mat-icon>
</div>
</span>
<ng-template #elseEmptyValueBlock>
{{ property.default | translate }}
</ng-template>
</div>

View File

@@ -0,0 +1,92 @@
@mixin adf-card-view-textitem-theme($theme) {
.adf {
&-textitem-icon {
font-size: 16px;
width: 16px;
height: 16px;
position: relative;
top: 3px;
padding-left: 8px;
opacity: 0.5;
}
&-update-icon {
padding-left: 13px;
}
&-textitem-readonly {
cursor: pointer;
&:hover mat-icon {
opacity: 1;
}
}
&-textitem-clickable-value {
cursor: pointer;
color: mat-color($primary);
}
&-textitem-editable {
display: flex;
mat-icon:hover {
opacity: 1;
cursor: pointer;
}
mat-form-field {
width: 100%;
}
input:focus,
textarea:focus {
border: 1px solid #EEE;
}
}
&-textitem-editable .mat-input-wrapper {
margin: 0;
padding-bottom: 0;
}
&-textitem-editable .mat-input-underline {
display: none;
}
&-textitem-editable .mat-input-infix {
padding: 0;
border-top: none;
}
&-textitem-editable .mat-input-placeholder-wrapper {
padding-top: 2em;
position: static;
}
&-textitem-editable .mat-input-placeholder {
top: 0;
}
&-textitem-editable .mat-input-element {
font-family: inherit;
position: relative;
padding-top: 3px;
}
&-textitem-editable .mat-input-element:focus {
padding: 5px;
left: -6px;
top: -6px;
}
&-textitem-editable input.mat-input-element {
margin-bottom: 2px;
}
&-textitem-editable input.mat-input-element:focus {
margin-bottom: -8px;
}
}
}

View File

@@ -0,0 +1,218 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { HttpClientModule } from '@angular/common/http';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { MatDatepickerModule, MatIconModule, MatInputModule, MatNativeDateModule } from '@angular/material';
import { By } from '@angular/platform-browser';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { CardViewTextItemModel } from '../models/card-view-textitem.model';
import { AppConfigService } from '../app-config/app-config.service';
import { CardViewUpdateService } from '../services/card-view-update.service';
import { LogService } from '../services/log.service';
import { TranslateLoaderService } from '../services/translate-loader.service';
import { CardViewTextItemComponent } from './card-view-textitem.component';
describe('CardViewTextItemComponent', () => {
let fixture: ComponentFixture<CardViewTextItemComponent>;
let component: CardViewTextItemComponent;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
HttpClientModule,
FormsModule,
NoopAnimationsModule,
MatDatepickerModule,
MatIconModule,
MatInputModule,
MatNativeDateModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateLoaderService
}
})
],
declarations: [
CardViewTextItemComponent
],
providers: [
AppConfigService,
CardViewUpdateService,
LogService
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CardViewTextItemComponent);
component = fixture.componentInstance;
component.property = new CardViewTextItemModel ({
label: 'Text label',
value: 'Lorem ipsum',
key: 'textkey',
default: 'FAKE-DEFAULT-KEY',
editable: false
});
});
afterEach(() => {
fixture.destroy();
TestBed.resetTestingModule();
});
it('should render the label and value', () => {
fixture.detectChanges();
let labelValue = fixture.debugElement.query(By.css('.adf-property-label'));
expect(labelValue).not.toBeNull();
expect(labelValue.nativeElement.innerText).toBe('Text label');
let value = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-value-${component.property.key}"]`));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('Lorem ipsum');
});
it('should render the default as value if the value is empty and editable false', () => {
component.property = new CardViewTextItemModel ({
label: 'Text label',
value: '',
key: 'textkey',
default: 'FAKE-DEFAULT-KEY',
editable: false
});
fixture.detectChanges();
let value = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-value-${component.property.key}"]`));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('FAKE-DEFAULT-KEY');
});
it('should render the default as value if the value is empty and editable true', () => {
component.property = new CardViewTextItemModel ({
label: 'Text label',
value: '',
key: 'textkey',
default: 'FAKE-DEFAULT-KEY',
editable: true
});
fixture.detectChanges();
let value = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-value-${component.property.key}"]`));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('FAKE-DEFAULT-KEY');
});
it('should render the default as value if the value is empty and clickable false', () => {
component.property = new CardViewTextItemModel ({
label: 'Text label',
value: '',
key: 'textkey',
default: 'FAKE-DEFAULT-KEY',
clickable: false
});
fixture.detectChanges();
let value = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-value-${component.property.key}"]`));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('FAKE-DEFAULT-KEY');
});
it('should render the default as value if the value is empty and clickable true', () => {
component.property = new CardViewTextItemModel ({
label: 'Text label',
value: '',
key: 'textkey',
default: 'FAKE-DEFAULT-KEY',
clickable: true
});
fixture.detectChanges();
let value = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-value-${component.property.key}"]`));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('FAKE-DEFAULT-KEY');
});
it('should render value when editable:true', () => {
component.editable = true;
component.property.editable = true;
fixture.detectChanges();
let value = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-value-${component.property.key}"]`));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText.trim()).toBe('Lorem ipsum');
});
it('should render the edit icon in case of editable:true', () => {
component.editable = true;
component.property.editable = true;
fixture.detectChanges();
let editIcon = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-edit-icon-${component.property.key}"]`));
expect(editIcon).not.toBeNull('Edit icon should be shown');
});
it('should NOT render the edit icon in case of editable:false', () => {
component.editable = false;
fixture.detectChanges();
let editIcon = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-edit-icon-${component.property.key}"]`));
expect(editIcon).toBeNull('Edit icon should NOT be shown');
});
it('should NOT render the picker and toggle in case of editable:true but (general) editable:false', () => {
component.editable = false;
component.property.editable = true;
fixture.detectChanges();
let editIcon = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-edit-icon-${component.property.key}"]`));
expect(editIcon).toBeNull('Edit icon should NOT be shown');
});
it('should trigger an update event on the CardViewUpdateService', (done) => {
component.editable = true;
component.property.editable = true;
const cardViewUpdateService = TestBed.get(CardViewUpdateService);
const expectedText = 'changed text';
fixture.detectChanges();
cardViewUpdateService.itemUpdated$.subscribe(
(updateNotification) => {
expect(updateNotification.target).toBe(component.property);
expect(updateNotification.changed).toEqual({ textkey: expectedText });
done();
}
);
let editIcon = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-edit-toggle-${component.property.key}"]`));
editIcon.triggerEventHandler('click', null);
fixture.detectChanges();
let editInput = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-editinput-${component.property.key}"]`));
editInput.nativeElement.value = expectedText;
editInput.nativeElement.dispatchEvent(new Event('input'));
fixture.detectChanges();
let updateInput = fixture.debugElement.query(By.css(`[data-automation-id="card-textitem-update-${component.property.key}"]`));
updateInput.triggerEventHandler('click', null);
});
});

View File

@@ -0,0 +1,73 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Component, Input, OnChanges, ViewChild } from '@angular/core';
import { CardViewTextItemModel } from '../models/card-view-textitem.model';
import { CardViewUpdateService } from '../services/card-view-update.service';
@Component({
selector: 'adf-card-view-textitem',
templateUrl: './card-view-textitem.component.html',
styleUrls: ['./card-view-textitem.component.scss']
})
export class CardViewTextItemComponent implements OnChanges {
@Input()
property: CardViewTextItemModel;
@Input()
editable: boolean;
@ViewChild('editorInput')
private editorInput: any;
inEdit: boolean = false;
editedValue: string;
constructor(private cardViewUpdateService: CardViewUpdateService) {}
ngOnChanges() {
this.editedValue = this.property.value;
}
isEditble() {
return this.editable && this.property.editable;
}
isClickable() {
return this.property.clickable;
}
setEditMode(editStatus: boolean): void {
this.inEdit = editStatus;
setTimeout(() => {
this.editorInput.nativeElement.click();
}, 0);
}
reset(): void {
this.editedValue = this.property.value;
this.setEditMode(false);
}
update(): void {
this.cardViewUpdateService.update(this.property, { [this.property.key]: this.editedValue });
}
clicked(): void {
this.cardViewUpdateService.clicked(this.property);
}
}

View File

@@ -0,0 +1,7 @@
<div class="adf-property-list">
<ng-container *ngFor="let property of properties">
<div [attr.data-automation-id]="'header-'+property.key" class="adf-property">
<adf-card-view-item-dispatcher [property]="property" [editable]="editable"></adf-card-view-item-dispatcher>
</div>
</ng-container>
</div>

View File

@@ -0,0 +1,34 @@
@mixin adf-card-view-theme($theme) {
.adf {
&-property-list {
display: table;
width: 100%;
border-collapse: collapse;
border-spacing: 0;
}
&-property {
display: table-row;
}
&-property &-property-label {
display: table-cell;
min-width: 100px;
padding-right: 30px;
word-wrap: break-word;
color: rgb(186, 186, 186);;
vertical-align: top;
padding-bottom: 20px;
}
&-property &-property-value {
width: 100%;
display: table-cell;
color: rgb(101, 101, 101);
vertical-align: top;
padding-bottom: 20px;
}
}
}

View File

@@ -0,0 +1,158 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { HttpClientModule } from '@angular/common/http';
import { FormsModule } from '@angular/forms';
import { MatDatepickerModule, MatIconModule, MatInputModule, MatNativeDateModule } from '@angular/material';
import { By } from '@angular/platform-browser';
import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { AppConfigService } from '../app-config/app-config.service';
import { CardViewDateItemModel } from '../models/card-view-dateitem.model';
import { CardViewTextItemModel } from '../models/card-view-textitem.model';
import { CardViewUpdateService } from '../services/card-view-update.service';
import { TranslateLoaderService } from '../services/translate-loader.service';
import { CardViewContentProxyDirective } from './card-view-content-proxy.directive';
import { CardViewDateItemComponent } from './card-view-dateitem.component';
import { CardViewItemDispatcherComponent } from './card-view-item-dispatcher.component';
import { CardViewTextItemComponent } from './card-view-textitem.component';
import { CardViewComponent } from './card-view.component';
describe('AdfCardView', () => {
let fixture: ComponentFixture<CardViewComponent>;
let component: CardViewComponent;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
HttpClientModule,
MatDatepickerModule,
MatIconModule,
MatInputModule,
MatNativeDateModule,
FormsModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateLoaderService
}
})
],
declarations: [
CardViewComponent,
CardViewItemDispatcherComponent,
CardViewContentProxyDirective,
CardViewTextItemComponent,
CardViewDateItemComponent
],
providers: [
CardViewUpdateService,
AppConfigService
]
});
// entryComponents are not supported yet on TestBed, that is why this ugly workaround:
// https://github.com/angular/angular/issues/10760
TestBed.overrideModule(BrowserDynamicTestingModule, {
set: { entryComponents: [ CardViewTextItemComponent, CardViewDateItemComponent ] }
});
TestBed.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(CardViewComponent);
component = fixture.componentInstance;
});
it('should render the label and value', async(() => {
component.properties = [new CardViewTextItemModel({label: 'My label', value: 'My value', key: 'some key'})];
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
let labelValue = fixture.debugElement.query(By.css('.adf-property-label'));
expect(labelValue).not.toBeNull();
expect(labelValue.nativeElement.innerText).toBe('My label');
let value = fixture.debugElement.query(By.css('.adf-property-value'));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText).toBe('My value');
});
}));
it('should pass through editable property to the items', () => {
component.editable = true;
component.properties = [new CardViewDateItemModel({
label: 'My date label',
value: '2017-06-14',
key: 'some-key',
editable: true
})];
fixture.detectChanges();
let datePicker = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-some-key"]`));
expect(datePicker).not.toBeNull('Datepicker should be in DOM');
});
it('should render the date in the correct format', async(() => {
component.properties = [new CardViewDateItemModel({
label: 'My date label', value: '2017-06-14', key: 'some key',
format: 'MMM DD YYYY'
})];
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
let labelValue = fixture.debugElement.query(By.css('.adf-property-label'));
expect(labelValue).not.toBeNull();
expect(labelValue.nativeElement.innerText).toBe('My date label');
let value = fixture.debugElement.query(By.css('.adf-property-value'));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText).toBe('Jun 14 2017');
});
}));
it('should render the default value if the value is empty', async(() => {
component.properties = [new CardViewTextItemModel({
label: 'My default label',
value: null,
default: 'default value',
key: 'some key'
})];
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
let labelValue = fixture.debugElement.query(By.css('.adf-property-label'));
expect(labelValue).not.toBeNull();
expect(labelValue.nativeElement.innerText).toBe('My default label');
let value = fixture.debugElement.query(By.css('.adf-property-value'));
expect(value).not.toBeNull();
expect(value.nativeElement.innerText).toBe('default value');
});
}));
});

View File

@@ -0,0 +1,32 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Component, Input } from '@angular/core';
import { CardViewItem } from '../interface/card-view-item.interface';
@Component({
selector: 'adf-card-view',
templateUrl: './card-view.component.html',
styleUrls: ['./card-view.component.scss']
})
export class CardViewComponent {
@Input()
properties: CardViewItem [];
@Input()
editable: boolean;
}

View File

@@ -0,0 +1,62 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { MatButtonModule, MatDatepickerModule, MatIconModule, MatInputModule, MatNativeDateModule } from '@angular/material';
import { TranslateModule } from '@ngx-translate/core';
import { CardViewContentProxyDirective } from './card-view-content-proxy.directive';
import { CardViewDateItemComponent } from './card-view-dateitem.component';
import { CardViewItemDispatcherComponent } from './card-view-item-dispatcher.component';
import { CardViewMapItemComponent } from './card-view-mapitem.component';
import { CardViewTextItemComponent } from './card-view-textitem.component';
import { CardViewComponent } from './card-view.component';
@NgModule({
imports: [
CommonModule,
MatDatepickerModule,
MatNativeDateModule,
MatInputModule,
MatIconModule,
MatButtonModule,
FormsModule,
TranslateModule
],
declarations: [
CardViewComponent,
CardViewItemDispatcherComponent,
CardViewContentProxyDirective,
CardViewTextItemComponent,
CardViewMapItemComponent,
CardViewDateItemComponent
],
entryComponents: [
CardViewTextItemComponent,
CardViewMapItemComponent,
CardViewDateItemComponent
],
exports: [
CardViewComponent,
CardViewTextItemComponent,
CardViewMapItemComponent,
CardViewDateItemComponent
]
})
export class CardViewModule {}

View File

@@ -0,0 +1,18 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './public-api';

View File

@@ -0,0 +1,25 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './card-view-content-proxy.directive';
export * from './card-view-dateitem.component';
export * from './card-view-item-dispatcher.component';
export * from './card-view-mapitem.component';
export * from './card-view-textitem.component';
export * from './card-view.component';
export * from './card-view.module';

View File

@@ -0,0 +1,20 @@
<div class="adf-panel adf-panel-default" [ngClass]="{'adf-panel-open': isOpen}">
<div class="adf-panel-heading" [ngClass]="{'adf-panel-heading-selected': isSelected}" (click)="toggleOpen($event)">
<div id="heading-icon" *ngIf="hasHeadingIcon()" class="adf-panel-heading-icon">
<mat-icon class="material-icons"
[matTooltip]="headingIconTooltip"
[matTooltipDisabled]="!headingIconTooltip">
{{headingIcon}}
</mat-icon>
</div>
<div id="heading-text" class="adf-panel-heading-text">{{heading}}</div>
<div id="accordion-button" *ngIf="hasAccordionIcon" class="adf-panel-heading-toggle">
<i class="material-icons">{{getAccordionIcon()}}</i>
</div>
</div>
<div class="adf-panel-collapse" [hidden]="!isOpen">
<div class="adf-panel-body" #contentWrapper>
<ng-content></ng-content>
</div>
</div>
</div>

View File

@@ -0,0 +1,43 @@
@mixin adf-accordion-theme($theme) {
$primary: map-get($theme, primary);
.adf-panel-heading {
float: left;
font-size: 14px;
font-weight: bold;
font-style: normal;
font-stretch: normal;
line-height: normal;
letter-spacing: normal;
text-align: left;
width: 100%;
cursor: pointer;
}
.adf-panel-heading-selected {
color: mat-color($primary);
}
.adf-panel-heading-icon {
float: left;
}
.adf-panel-body {
display: inline-block;
}
.adf-panel-heading-text {
float: left;
padding-left: 20px;
padding-top: 4px;
}
.adf-panel-heading-toggle {
float: right;
cursor: pointer;
}
.adf-panel-heading-toggle:hover {
opacity: 0.4;
}
}

View File

@@ -0,0 +1,118 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AccordionGroupComponent } from './accordion-group.component';
import { AccordionComponent } from './accordion.component';
import { MaterialModule } from '../material.module';
describe('AccordionGroupComponent', () => {
let fixture: ComponentFixture<AccordionGroupComponent>;
let component: AccordionGroupComponent;
let element: any;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
MaterialModule
],
declarations: [
AccordionGroupComponent
],
providers: [AccordionComponent]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AccordionGroupComponent);
element = fixture.nativeElement;
component = fixture.componentInstance;
});
it('should be closed by default', () => {
component.heading = 'Fake Header';
component.headingIcon = 'fake-icon';
component.contentWrapper.nativeElement.innerHTML = '<a>Test</a>';
fixture.whenStable().then(() => {
fixture.detectChanges();
let headerText = element.querySelector('#heading-text');
expect(headerText.innerText).toEqual('Fake Header');
let headerIcon = element.querySelector('#heading-icon .material-icons');
expect(headerIcon.innerText).toEqual('fake-icon');
let headerToggle = element.querySelector('#accordion-button .material-icons');
expect(headerToggle.innerText).toEqual('expand_more');
});
});
it('should be open when click', () => {
component.isSelected = true;
component.heading = 'Fake Header';
component.headingIcon = 'fake-icon';
component.contentWrapper.nativeElement.innerHTML = '<a>Test</a>';
fixture.detectChanges();
element.querySelector('#accordion-button').click();
fixture.whenStable().then(() => {
fixture.detectChanges();
let headerText = element.querySelector('#heading-text');
expect(headerText.innerText).toEqual('Fake Header');
let headerIcon = element.querySelector('#heading-icon .material-icons');
expect(headerIcon.innerText).toEqual('fake-icon');
let headerToggle = element.querySelector('#accordion-button .material-icons');
expect(headerToggle.innerText).toEqual('expand_less');
});
});
it('should show expand icon by default', () => {
component.heading = 'Fake Header';
component.headingIcon = 'fake-icon';
component.contentWrapper.nativeElement.innerHTML = '<a>Test</a>';
fixture.whenStable().then(() => {
fixture.detectChanges();
let headerIcon = element.querySelector('#accordion-button');
expect(headerIcon).toBeDefined();
});
});
it('should hide expand icon', () => {
component.heading = 'Fake Header';
component.headingIcon = 'fake-icon';
component.hasAccordionIcon = false;
component.contentWrapper.nativeElement.innerHTML = '<a>Test</a>';
fixture.whenStable().then(() => {
fixture.detectChanges();
let headerIcon = element.querySelector('#accordion-button');
expect(headerIcon).toBeNull();
});
});
it('should emit an event when a heading clicked', (done) => {
component.heading = 'Fake Header';
fixture.detectChanges();
let heading: string = component.heading;
component.headingClick.subscribe((headName: string) => {
expect(headName).toBeDefined();
expect(headName).toEqual(heading);
done();
});
let header = element.querySelector('.adf-panel-heading');
header.click();
});
});

View File

@@ -0,0 +1,92 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Component, EventEmitter, Input, OnDestroy, Output, ViewChild, ViewEncapsulation } from '@angular/core';
import { AccordionComponent } from './accordion.component';
@Component({
selector: 'adf-accordion-group',
templateUrl: 'accordion-group.component.html',
styleUrls: ['./accordion-group.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class AccordionGroupComponent implements OnDestroy {
private _isOpen: boolean = false;
private _isSelected: boolean = false;
@ViewChild('contentWrapper')
contentWrapper: any;
@Input()
heading: string;
@Input()
headingIcon: string;
@Input()
headingIconTooltip: string;
@Input()
hasAccordionIcon: boolean = true;
@Output()
headingClick: EventEmitter<any> = new EventEmitter<any>();
@Input()
set isOpen(value: boolean) {
this._isOpen = value;
if (value) {
this.accordion.closeOthers(this);
}
}
get isOpen() {
return this._isOpen;
}
@Input()
set isSelected(value: boolean) {
this._isSelected = value;
}
get isSelected() {
return this._isSelected;
}
constructor(private accordion: AccordionComponent) {
this.accordion.addGroup(this);
}
ngOnDestroy() {
this.accordion.removeGroup(this);
}
hasHeadingIcon() {
return this.headingIcon ? true : false;
}
toggleOpen(event: MouseEvent): void {
event.preventDefault();
this.isOpen = !this.isOpen;
this.headingClick.emit(this.heading);
}
getAccordionIcon(): string {
return this.isOpen ? 'expand_less' : 'expand_more';
}
}

View File

@@ -0,0 +1,81 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AccordionGroupComponent } from './accordion-group.component';
import { AccordionComponent } from './accordion.component';
describe('AccordionComponent', () => {
let fixture: ComponentFixture<AccordionComponent>;
let component: AccordionComponent;
let componentGroup1: AccordionGroupComponent;
let componentGroup2: AccordionGroupComponent;
let componentGroup3: AccordionGroupComponent;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
AccordionComponent
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AccordionComponent);
component = fixture.componentInstance;
});
afterEach(() => {
component.groups = [];
});
it('should create the component', () => {
expect(component).toBeTruthy();
});
it('should add the AccordionGroup', () => {
component.addGroup(componentGroup1);
expect(component.groups.length).toBe(1);
});
it('should close all the other group', () => {
componentGroup1 = new AccordionGroupComponent(component);
componentGroup2 = new AccordionGroupComponent(component);
componentGroup3 = new AccordionGroupComponent(component);
componentGroup1.isOpen = false;
componentGroup2.isOpen = true;
componentGroup3.isOpen = false;
expect(component.groups[0].isOpen).toBeFalsy();
expect(component.groups[1].isOpen).toBeTruthy();
expect(component.groups[2].isOpen).toBeFalsy();
componentGroup1.isOpen = true;
expect(component.groups[0].isOpen).toBeTruthy();
expect(component.groups[1].isOpen).toBeFalsy();
expect(component.groups[2].isOpen).toBeFalsy();
});
it('should remove the AccordionGroup', () => {
component.addGroup(componentGroup1);
component.removeGroup(componentGroup1);
expect(component.groups.length).toBe(0);
});
});

View File

@@ -0,0 +1,52 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Component, ViewEncapsulation } from '@angular/core';
import { AccordionGroupComponent } from './accordion-group.component';
@Component({
selector: 'adf-accordion',
template: `
<ng-content></ng-content>
`,
host: {
'class': 'panel-group'
},
encapsulation: ViewEncapsulation.None
})
export class AccordionComponent {
groups: Array<AccordionGroupComponent> = [];
addGroup(group: AccordionGroupComponent): void {
this.groups.push(group);
}
closeOthers(openGroup: AccordionGroupComponent): void {
this.groups.forEach((group: AccordionGroupComponent) => {
if (group !== openGroup) {
group.isOpen = false;
}
});
}
removeGroup(group: AccordionGroupComponent): void {
const index = this.groups.indexOf(group);
if (index !== -1) {
this.groups.splice(index, 1);
}
}
}

View File

@@ -0,0 +1,39 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { MaterialModule } from '../material.module';
import { AccordionGroupComponent } from './accordion-group.component';
import { AccordionComponent } from './accordion.component';
@NgModule({
imports: [
MaterialModule,
CommonModule
],
declarations: [
AccordionComponent,
AccordionGroupComponent
],
exports: [
AccordionComponent,
AccordionGroupComponent
]
})
export class CollapsableModule {}

View File

@@ -0,0 +1,18 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './public-api';

View File

@@ -0,0 +1,21 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './accordion-group.component';
export * from './accordion.component';
export * from './collapsable.module';

View File

@@ -0,0 +1,263 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { OverlayContainer } from '@angular/cdk/overlay';
import { ViewportRuler } from '@angular/cdk/scrolling';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ContextMenuHolderComponent } from './context-menu-holder.component';
import { ContextMenuModule } from './context-menu.module';
import { ContextMenuService } from './context-menu.service';
describe('ContextMenuHolderComponent', () => {
let fixture: ComponentFixture<ContextMenuHolderComponent>;
let component: ContextMenuHolderComponent;
let contextMenuService: ContextMenuService;
let overlayContainer = {
getContainerElement: () => ({
addEventListener: () => {},
querySelector: (val) => ({
name: val,
clientWidth: 0,
clientHeight: 0,
parentElement: {
style: {
left: 0,
top: 0
}
}
})
})
};
let getViewportRect = {
getViewportRect: () => ({
left: 0, top: 0, width: 1014, height: 686, bottom: 0, right: 0
})
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
ContextMenuModule
],
providers: [
{
provide: OverlayContainer,
useValue: overlayContainer
},
{
provide: ViewportRuler,
useValue: getViewportRect
}
]
});
fixture = TestBed.createComponent(ContextMenuHolderComponent);
component = fixture.componentInstance;
contextMenuService = TestBed.get(ContextMenuService);
fixture.detectChanges();
});
beforeEach(() => {
spyOn(component.menuTrigger, 'openMenu');
});
describe('Events', () => {
it('should show menu on service event', () => {
spyOn(component, 'showMenu');
contextMenuService.show.next(<any> {});
expect(component.showMenu).toHaveBeenCalled();
});
it('should set DOM element reference on menu open event', () => {
component.menuTrigger.onMenuOpen.next();
expect(component.mdMenuElement.name).toBe('.context-menu');
});
it('should reset DOM element reference on menu close event', () => {
component.menuTrigger.onMenuClose.next();
expect(component.mdMenuElement).toBe(null);
});
});
describe('onMenuItemClick()', () => {
const menuItem = {
model: {
disabled: false
},
subject: {
next: (val) => val
}
};
const event = {
preventDefault: () => null,
stopImmediatePropagation: () => null
};
beforeEach(() => {
spyOn(menuItem.subject, 'next');
});
it('should emit when link is not disabled', () => {
component.onMenuItemClick(<any> event, menuItem);
expect(menuItem.subject.next).toHaveBeenCalledWith(menuItem);
});
it('should not emit when link is disabled', () => {
menuItem.model.disabled = true;
component.onMenuItemClick(<any> event, menuItem);
expect(menuItem.subject.next).not.toHaveBeenCalled();
});
});
describe('showMenu()', () => {
it('should open menu panel', () => {
component.showMenu(<any> {}, [{}]);
expect(component.menuTrigger.openMenu).toHaveBeenCalled();
});
});
describe('Menu position', () => {
beforeEach(() => {
component.menuTrigger.onMenuOpen.next();
component.mdMenuElement.clientHeight = 160;
component.mdMenuElement.clientWidth = 200;
});
it('should set position to mouse position', () => {
const contextMenuEvent = {
clientX: 100,
clientY: 210
};
component.showMenu(<any> contextMenuEvent, [{}]);
expect(component.mdMenuElement.parentElement.style).toEqual({
left: '100px',
top: '210px'
});
});
it('should ajust position relative to right margin of the screen', () => {
const contextMenuEvent = {
clientX: 1000,
clientY: 210
};
component.showMenu(<any> contextMenuEvent, [{}]);
expect(component.mdMenuElement.parentElement.style).toEqual({
left: '800px',
top: '210px'
});
});
it('should ajust position relative to bottom margin of the screen', () => {
const contextMenuEvent = {
clientX: 100,
clientY: 600
};
component.showMenu(<any> contextMenuEvent, [{}]);
expect(component.mdMenuElement.parentElement.style).toEqual({
left: '100px',
top: '440px'
});
});
it('should ajust position relative to bottom - right margin of the screen', () => {
const contextMenuEvent = {
clientX: 900,
clientY: 610
};
component.showMenu(<any> contextMenuEvent, [{}]);
expect(component.mdMenuElement.parentElement.style).toEqual({
left: '700px',
top: '450px'
});
});
});
describe('Menu direction', () => {
beforeEach(() => {
component.menuTrigger.onMenuOpen.next();
component.mdMenuElement.clientHeight = 160;
component.mdMenuElement.clientWidth = 200;
});
it('should set default menu direction', () => {
const contextMenuEvent = {
clientX: 100,
clientY: 210
};
component.showMenu(<any> contextMenuEvent, [{}]);
expect(component.menuTrigger.menu.xPosition).toBe('after');
expect(component.menuTrigger.menu.yPosition).toBe('below');
});
it('should ajust direction relative to right margin of the screen', () => {
const contextMenuEvent = {
clientX: 1000,
clientY: 210
};
component.showMenu(<any> contextMenuEvent, [{}]);
expect(component.menuTrigger.menu.xPosition).toBe('before');
expect(component.menuTrigger.menu.yPosition).toBe('below');
});
it('should ajust direction relative to bottom margin of the screen', () => {
const contextMenuEvent = {
clientX: 100,
clientY: 600
};
component.showMenu(<any> contextMenuEvent, [{}]);
expect(component.menuTrigger.menu.xPosition).toBe('after');
expect(component.menuTrigger.menu.yPosition).toBe('above');
});
it('should ajust position relative to bottom - right margin of the screen', () => {
const contextMenuEvent = {
clientX: 900,
clientY: 610
};
component.showMenu(<any> contextMenuEvent, [{}]);
expect(component.menuTrigger.menu.xPosition).toBe('before');
expect(component.menuTrigger.menu.yPosition).toBe('above');
});
});
});

View File

@@ -0,0 +1,169 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { OverlayContainer } from '@angular/cdk/overlay';
import { ViewportRuler } from '@angular/cdk/scrolling';
import { Component, HostListener, Input, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';
import { MatMenuTrigger } from '@angular/material';
import { Subscription } from 'rxjs/Rx';
import { ContextMenuService } from './context-menu.service';
@Component({
selector: 'adf-context-menu-holder, context-menu-holder',
template: `
<button mat-button [matMenuTriggerFor]="contextMenu"></button>
<mat-menu #contextMenu="matMenu" class="context-menu">
<button
*ngFor="let link of links"
mat-menu-item
(click)="onMenuItemClick($event, link)"
[attr.disabled]="link.model?.disabled || undefined">
<mat-icon *ngIf="showIcons && link.model?.icon">
{{ link.model?.icon }}
</mat-icon>
{{link.title || link.model?.title}}
</button>
</mat-menu>
`
})
export class ContextMenuHolderComponent implements OnInit, OnDestroy {
links = [];
private mouseLocation: { left: number, top: number } = {left: 0, top: 0};
private menuElement = null;
private openSubscription: Subscription;
private closeSubscription: Subscription;
private contextSubscription: Subscription;
private contextMenuListenerFn: () => void;
@Input()
showIcons: boolean = false;
@ViewChild(MatMenuTrigger)
menuTrigger: MatMenuTrigger;
@HostListener('contextmenu', ['$event'])
onShowContextMenu(event?: MouseEvent) {
if (event) {
event.preventDefault();
}
}
@HostListener('window:resize', ['$event'])
onResize(event) {
if (this.mdMenuElement) {
this.setPosition();
}
}
constructor(
private viewport: ViewportRuler,
private overlayContainer: OverlayContainer,
private contextMenuService: ContextMenuService,
private renderer: Renderer2
) {}
ngOnInit() {
this.contextSubscription = this.contextMenuService.show.subscribe(e => this.showMenu(e.event, e.obj));
this.openSubscription = this.menuTrigger.onMenuOpen.subscribe(() => {
const container = this.overlayContainer.getContainerElement();
if (container) {
this.contextMenuListenerFn = this.renderer.listen(container, 'contextmenu', (e: Event) => {
e.preventDefault();
});
}
this.menuElement = this.getContextMenuElement();
});
this.closeSubscription = this.menuTrigger.onMenuClose.subscribe(() => {
this.menuElement = null;
if (this.contextMenuListenerFn) {
this.contextMenuListenerFn();
}
});
}
ngOnDestroy() {
if (this.contextMenuListenerFn) {
this.contextMenuListenerFn();
}
this.contextSubscription.unsubscribe();
this.openSubscription.unsubscribe();
this.closeSubscription.unsubscribe();
this.menuElement = null;
}
onMenuItemClick(event: Event, menuItem: any): void {
if (menuItem && menuItem.model && menuItem.model.disabled) {
event.preventDefault();
event.stopImmediatePropagation();
return;
}
menuItem.subject.next(menuItem);
}
showMenu(e, links) {
this.links = links;
if (e) {
this.mouseLocation = {
left: e.clientX,
top: e.clientY
};
}
this.menuTrigger.openMenu();
if (this.mdMenuElement) {
this.setPosition();
}
}
get mdMenuElement() {
return this.menuElement;
}
private locationCss() {
return {
left: this.mouseLocation.left + 'px',
top: this.mouseLocation.top + 'px'
};
}
private setPosition() {
if (this.mdMenuElement.clientWidth + this.mouseLocation.left > this.viewport.getViewportRect().width) {
this.menuTrigger.menu.xPosition = 'before';
this.mdMenuElement.parentElement.style.left = this.mouseLocation.left - this.mdMenuElement.clientWidth + 'px';
} else {
this.menuTrigger.menu.xPosition = 'after';
this.mdMenuElement.parentElement.style.left = this.locationCss().left;
}
if (this.mdMenuElement.clientHeight + this.mouseLocation.top > this.viewport.getViewportRect().height) {
this.menuTrigger.menu.yPosition = 'above';
this.mdMenuElement.parentElement.style.top = this.mouseLocation.top - this.mdMenuElement.clientHeight + 'px';
} else {
this.menuTrigger.menu.yPosition = 'below';
this.mdMenuElement.parentElement.style.top = this.locationCss().top;
}
}
private getContextMenuElement() {
return this.overlayContainer.getContainerElement().querySelector('.context-menu');
}
}

View File

@@ -0,0 +1,72 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { ContextMenuDirective } from './context-menu.directive';
import { ContextMenuService } from './context-menu.service';
describe('ContextMenuDirective', () => {
let contextMenuService;
let directive;
beforeEach(() => {
contextMenuService = new ContextMenuService();
directive = new ContextMenuDirective(contextMenuService);
directive.enabled = true;
});
it('should show menu via service', (done) => {
contextMenuService.show.subscribe(() => {
done();
});
directive.links = [{}];
directive.onShowContextMenu(null);
});
it('should prevent default behavior', () => {
let event = new MouseEvent('click');
spyOn(event, 'preventDefault').and.callThrough();
directive.onShowContextMenu(event);
expect(event.preventDefault).toHaveBeenCalled();
});
it('should forward event to service', () => {
let event = new MouseEvent('click');
contextMenuService.show.subscribe(e => {
expect(e.event).toBeDefined();
expect(e.event).toBe(event);
});
directive.onShowContextMenu(event);
});
it('should forward menu items to service', () => {
let links = [{}, {}];
directive.links = links;
contextMenuService.show.subscribe(e => {
expect(e.obj).toBeDefined();
expect(e.obj).toBe(links);
});
directive.onShowContextMenu(null);
});
});

View File

@@ -0,0 +1,48 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Directive, HostListener, Input } from '@angular/core';
import { ContextMenuService } from './context-menu.service';
@Directive({
selector: '[adf-context-menu], [context-menu]'
})
export class ContextMenuDirective {
@Input('context-menu')
links: any[];
@Input('context-menu-enabled')
enabled: boolean = false;
constructor(private _contextMenuService: ContextMenuService) {
}
@HostListener('contextmenu', ['$event'])
onShowContextMenu(event?: MouseEvent) {
if (this.enabled) {
if (event) {
event.preventDefault();
}
if (this.links && this.links.length > 0) {
if (this._contextMenuService) {
this._contextMenuService.show.next({event: event, obj: this.links});
}
}
}
}
}

View File

@@ -0,0 +1,43 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { MaterialModule } from '../material.module';
import { ContextMenuHolderComponent } from './context-menu-holder.component';
import { ContextMenuDirective } from './context-menu.directive';
import { ContextMenuService } from './context-menu.service';
@NgModule({
imports: [
CommonModule,
MaterialModule
],
declarations: [
ContextMenuHolderComponent,
ContextMenuDirective
],
exports: [
ContextMenuHolderComponent,
ContextMenuDirective
],
providers: [
ContextMenuService
]
})
export class ContextMenuModule {}

View File

@@ -0,0 +1,32 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { ContextMenuService } from './context-menu.service';
describe('ContextMenuService', () => {
let service;
beforeEach(() => {
service = new ContextMenuService();
});
it('should setup default show subject', () => {
expect(service.show).toBeDefined();
});
});

View File

@@ -0,0 +1,24 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Rx';
@Injectable()
export class ContextMenuService {
public show: Subject<{event: MouseEvent, obj: any[]}> = new Subject<{event: MouseEvent, obj: any[]}>();
}

View File

@@ -0,0 +1,18 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './public-api';

View File

@@ -0,0 +1,22 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './context-menu-holder.component';
export * from './context-menu.directive';
export * from './context-menu.service';
export * from './context-menu.module';

121
lib/core/core.module.ts Normal file
View File

@@ -0,0 +1,121 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { CommonModule } from '@angular/common';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TRANSLATION_PROVIDER, TranslationService } from './services/translation.service';
import { MaterialModule } from './material.module';
import { AppConfigModule } from './app-config';
import { CardViewModule } from './card-view';
import { CollapsableModule } from './collapsable';
import { ContextMenuModule } from './context-menu';
import { DataColumnModule } from './data-column';
import { DataTableModule } from './datatable';
import { InfoDrawerModule } from './info-drawer';
import { LanguageMenuModule } from './language-menu';
import { LoginModule } from './login';
import { PaginationModule } from './pagination';
import { HostSettingsModule } from './settings';
import { ToolbarModule } from './toolbar';
import { UserInfoModule } from './userinfo';
import { ViewerModule } from './viewer';
import { FormModule } from './form';
import { DirectiveModule } from './directives';
import { PipeModule } from './pipes';
import { LogService , ServiceModule, TranslateLoaderService } from './services';
export function createTranslateLoader(http: HttpClient, logService: LogService) {
return new TranslateLoaderService(http, logService);
}
@NgModule({
imports: [
ViewerModule,
PipeModule,
CommonModule,
DirectiveModule,
FormsModule,
ReactiveFormsModule,
HttpClientModule,
BrowserAnimationsModule,
HostSettingsModule,
UserInfoModule,
MaterialModule,
AppConfigModule,
PaginationModule,
ToolbarModule,
ContextMenuModule,
CardViewModule,
CollapsableModule,
ServiceModule,
FormModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: (createTranslateLoader),
deps: [HttpClient, LogService]
}
})
],
providers: [
TranslationService,
{
provide: TRANSLATION_PROVIDER,
multi: true,
useValue: {
name: '@adf/core',
source: 'assets/@adf/core'
}
}
],
exports: [
AppConfigModule,
BrowserAnimationsModule,
CommonModule,
FormsModule,
ReactiveFormsModule,
HttpClientModule,
TranslateModule,
ContextMenuModule,
CardViewModule,
CollapsableModule,
PaginationModule,
ToolbarModule,
LoginModule,
UserInfoModule,
LanguageMenuModule,
InfoDrawerModule,
DataColumnModule,
DataTableModule,
HostSettingsModule,
ServiceModule,
ViewerModule,
PipeModule,
DirectiveModule,
FormModule
]
})
export class CoreModule {
}

View File

@@ -0,0 +1,37 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { async, TestBed } from '@angular/core/testing';
import { DataColumnListComponent } from './data-column-list.component';
describe('DataColumnListComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
DataColumnListComponent
]
}).compileComponents();
}));
it('should create the component', () => {
const fixture = TestBed.createComponent(DataColumnListComponent);
const component = fixture.debugElement.componentInstance;
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,31 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
/* tslint:disable:component-selector */
import { Component, ContentChildren, QueryList } from '@angular/core';
import { DataColumnComponent } from './data-column.component';
@Component({
selector: 'data-columns',
template: ''
})
export class DataColumnListComponent {
@ContentChildren(DataColumnComponent) columns: QueryList<DataColumnComponent>;
}

View File

@@ -0,0 +1,45 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { async, TestBed } from '@angular/core/testing';
import { DataColumnComponent } from './data-column.component';
describe('DataColumnListComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
DataColumnComponent
]
}).compileComponents();
}));
it('should create the component', () => {
const fixture = TestBed.createComponent(DataColumnComponent);
const component = fixture.debugElement.componentInstance;
expect(component).toBeTruthy();
});
it('sould setup screen reader title for thumbnails', () => {
const component = new DataColumnComponent();
component.key = '$thumbnail';
expect(component.srTitle).toBeFalsy();
component.ngOnInit();
expect(component.srTitle).toBeTruthy();
});
});

View File

@@ -0,0 +1,63 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
/* tslint:disable:component-selector */
import { Component, ContentChild, Input, OnInit, TemplateRef } from '@angular/core';
@Component({
selector: 'data-column',
template: ''
})
export class DataColumnComponent implements OnInit {
@Input()
key: string;
@Input()
type: string = 'text';
@Input()
format: string;
@Input()
sortable: boolean = true;
@Input()
title: string = '';
@ContentChild(TemplateRef)
template: any;
@Input()
formatTooltip: Function;
/**
* Title to be used for screen readers.
*/
@Input('sr-title')
srTitle: string;
@Input('class')
cssClass: string;
ngOnInit() {
if (!this.srTitle && this.key === '$thumbnail') {
this.srTitle = 'Thumbnail';
}
}
}

View File

@@ -0,0 +1,37 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { DataColumnListComponent } from './data-column-list.component';
import { DataColumnComponent } from './data-column.component';
@NgModule({
imports: [
CommonModule
],
declarations: [
DataColumnComponent,
DataColumnListComponent
],
exports: [
DataColumnComponent,
DataColumnListComponent
]
})
export class DataColumnModule {}

View File

@@ -0,0 +1,18 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './public-api';

View File

@@ -0,0 +1,21 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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.
*/
export * from './data-column-list.component';
export * from './data-column.component';
export * from './data-column.module';

View File

@@ -0,0 +1,43 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { BaseEvent } from '../../../events';
import { DataColumn } from '../../data/data-column.model';
import { DataRow } from '../../data/data-row.model';
export class DataCellEventModel {
readonly row: DataRow;
readonly col: DataColumn;
actions: any[];
constructor(row: DataRow, col: DataColumn, actions: any[]) {
this.row = row;
this.col = col;
this.actions = actions || [];
}
}
export class DataCellEvent extends BaseEvent<DataCellEventModel> {
constructor(row: DataRow, col: DataColumn, actions: any[]) {
super();
this.value = new DataCellEventModel(row, col, actions);
}
}

View File

@@ -0,0 +1,44 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { BaseEvent } from '../../../events';
import { DataRow } from '../../data/data-row.model';
export class DataRowActionEvent extends BaseEvent<DataRowActionModel> {
// backwards compatibility with 1.2.0 and earlier
get args(): DataRowActionModel {
return this.value;
}
constructor(row: DataRow, action: any) {
super();
this.value = new DataRowActionModel(row, action);
}
}
export class DataRowActionModel {
row: DataRow;
action: any;
constructor(row: DataRow, action: any) {
this.row = row;
this.action = action;
}
}

View File

@@ -0,0 +1,60 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { ChangeDetectionStrategy, Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
import { DataColumn } from '../../data/data-column.model';
import { DataRow } from '../../data/data-row.model';
import { DataTableAdapter } from '../../data/datatable-adapter';
@Component({
selector: 'adf-datatable-cell',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<ng-container>
<span [title]="tooltip" class="adf-datatable-cell-value">{{value}}</span>
</ng-container>`,
encapsulation: ViewEncapsulation.None,
host: { class: 'adf-datatable-cell' }
})
export class DataTableCellComponent implements OnInit {
@Input()
data: DataTableAdapter;
@Input()
column: DataColumn;
@Input()
row: DataRow;
@Input()
value: any;
@Input()
tooltip: string;
ngOnInit() {
if (!this.value && this.column && this.column.key && this.row && this.data) {
this.value = this.data.getValue(this.row, this.column);
if (!this.tooltip) {
this.tooltip = this.value;
}
}
}
}

View File

@@ -0,0 +1,187 @@
<table
*ngIf="data"
class="full-width adf-data-table">
<thead *ngIf="showHeader">
<tr>
<!-- Actions (left) -->
<th *ngIf="actions && actionsPosition === 'left'" class="actions-column">
<span class="sr-only">Actions</span>
</th>
<!-- Columns -->
<th *ngIf="multiselect">
<mat-checkbox [checked]="isSelectAllChecked" (change)="onSelectAllClick($event)"></mat-checkbox>
</th>
<th class="adf-data-table-cell--{{col.type || 'text'}} {{col.cssClass}}"
*ngFor="let col of data.getColumns()"
[class.sortable]="col.sortable"
[attr.data-automation-id]="'auto_id_' + col.key"
[class.adf-data-table__header--sorted-asc]="isColumnSorted(col, 'asc')"
[class.adf-data-table__header--sorted-desc]="isColumnSorted(col, 'desc')"
(click)="onColumnHeaderClick(col)"
(keyup.enter)="onColumnHeaderClick(col)"
role="button"
tabindex="0"
title="{{ col.title | translate }}">
<span *ngIf="col.srTitle" class="sr-only">{{ col.srTitle | translate }}</span>
<span *ngIf="col.title">{{ col.title | translate}}</span>
</th>
<!-- Actions (right) -->
<th *ngIf="actions && actionsPosition === 'right'" class="actions-column">
<span class="sr-only">Actions</span>
</th>
</tr>
</thead>
<tbody>
<ng-container *ngIf="!loading && !noPermission">
<tr *ngFor="let row of data.getRows(); let idx = index"
role="button"
[class.is-selected]="row.isSelected"
[adf-upload]="allowDropFiles && rowAllowsDrop(row)" [adf-upload-data]="row"
[ngStyle]="rowStyle"
[ngClass]="getRowStyle(row)"
(keyup)="onRowKeyUp(row, $event)">
<!-- Actions (left) -->
<td *ngIf="actions && actionsPosition === 'left'">
<button mat-icon-button [matMenuTriggerFor]="menu"
[attr.data-automation-id]="'action_menu_' + idx">
<mat-icon>more_vert</mat-icon>
</button>
<mat-menu #menu="matMenu">
<button mat-menu-item *ngFor="let action of getRowActions(row)"
[attr.data-automation-id]="action.title"
[disabled]="action.disabled"
(click)="onExecuteRowAction(row, action)">
<mat-icon *ngIf="action.icon">{{ action.icon }}</mat-icon>
<span>{{ action.title | translate }}</span>
</button>
</mat-menu>
</td>
<td *ngIf="multiselect">
<mat-checkbox
[checked]="row.isSelected"
(change)="onCheckboxChange(row, $event)">
</mat-checkbox>
</td>
<td *ngFor="let col of data.getColumns()"
class="adf-data-table-cell adf-data-table-cell--{{col.type || 'text'}} {{col.cssClass}}"
tabindex="0"
(click)="onRowClick(row, $event)"
[context-menu]="getContextMenuActions(row, col)"
[context-menu-enabled]="contextMenu">
<div *ngIf="!col.template" class="cell-container">
<ng-container [ngSwitch]="col.type">
<div *ngSwitchCase="'image'" class="cell-value">
<mat-icon *ngIf="isIconValue(row, col)">{{ asIconValue(row, col) }}</mat-icon>
<mat-icon *ngIf="!isIconValue(row, col) && row.isSelected" svgIcon="selected" >
</mat-icon>
<img *ngIf="!isIconValue(row, col) && !row.isSelected"
alt="{{ iconAltTextKey(data.getValue(row, col)) | translate }}"
src="{{ data.getValue(row, col) }}"
(error)="onImageLoadingError($event)">
</div>
<div *ngSwitchCase="'icon'" class="cell-value">
<span class="sr-only">{{ iconAltTextKey(data.getValue(row, col)) | translate }}</span>
<mat-icon>{{ data.getValue(row, col) }}</mat-icon>
</div>
<div *ngSwitchCase="'date'" class="cell-value"
[attr.data-automation-id]="'date_' + data.getValue(row, col)">
<adf-date-cell
[data]="data"
[column]="col"
[row]="row"
[tooltip]="getCellTooltip(row, col)">
</adf-date-cell>
</div>
<div *ngSwitchCase="'location'" class="cell-value"
[attr.data-automation-id]="'location' + data.getValue(row, col)">
<adf-location-cell
[data]="data"
[column]="col"
[row]="row"
[tooltip]="getCellTooltip(row, col)">
</adf-location-cell>
</div>
<div *ngSwitchCase="'fileSize'" class="cell-value"
[attr.data-automation-id]="'fileSize_' + data.getValue(row, col)">
<adf-filesize-cell
[data]="data"
[column]="col"
[row]="row"
[tooltip]="getCellTooltip(row, col)">
</adf-filesize-cell>
</div>
<div *ngSwitchCase="'text'" class="cell-value"
[attr.data-automation-id]="'text_' + data.getValue(row, col)">
<adf-datatable-cell
[data]="data"
[column]="col"
[row]="row"
[tooltip]="getCellTooltip(row, col)">
</adf-datatable-cell>
</div>
<span *ngSwitchDefault class="cell-value">
<!-- empty cell for unknown column type -->
</span>
</ng-container>
</div>
<div *ngIf="col.template" class="cell-container">
<ng-container
[ngTemplateOutlet]="col.template"
[ngTemplateOutletContext]="{ $implicit: { data: data, row: row, col: col }, value: data.getValue(row, col) }">
</ng-container>
</div>
</td>
<!-- Actions (right) -->
<td *ngIf="actions && actionsPosition === 'right'" class="alfresco-datatable__actions-cell">
<button mat-icon-button [matMenuTriggerFor]="menu"
[attr.data-automation-id]="'action_menu_' + idx">
<mat-icon>more_vert</mat-icon>
</button>
<mat-menu #menu="matMenu">
<button mat-menu-item *ngFor="let action of getRowActions(row)"
[attr.data-automation-id]="action.title"
[disabled]="action.disabled"
(click)="onExecuteRowAction(row, action)">
<mat-icon *ngIf="action.icon">{{ action.icon }}</mat-icon>
<span>{{ action.title | translate }}</span>
</button>
</mat-menu>
</td>
</tr>
<tr *ngIf="data.getRows().length === 0">
<td class="adf-no-content-container"
[attr.colspan]="1 + data.getColumns().length">
<ng-template *ngIf="noContentTemplate"
ngFor [ngForOf]="[data]"
[ngForTemplate]="noContentTemplate">
</ng-template>
<ng-content select="adf-empty-list"></ng-content>
</td>
</tr>
</ng-container>
<tr *ngIf="!loading && noPermission" class="adf-no-permission__row">
<td class="adf-no-permission__cell">
<ng-template *ngIf="noPermissionTemplate"
ngFor [ngForOf]="[data]"
[ngForTemplate]="noPermissionTemplate">
</ng-template>
</td>
</tr>
<tr *ngIf="loading">
<td class="adf-loading-content-container"
[attr.colspan]="1 + data.getColumns().length">
<ng-template *ngIf="loadingTemplate"
ngFor [ngForOf]="[data]"
[ngForTemplate]="loadingTemplate">
</ng-template>
</td>
</tr>
</tbody>
</table>

View File

@@ -0,0 +1,296 @@
@mixin adf-datatable-theme($theme) {
$foreground: map-get($theme, foreground);
$background: map-get($theme, background);
$primary: map-get($theme, primary);
$data-table-font-size: 14px !default;
$data-table-header-font-size: 12px !default;
$data-table-header-sort-icon-size: 16px !default;
$data-table-header-color: mat-color($foreground, text) !default;
$data-table-header-sorted-color: mat-color($foreground, text) !default;
$data-table-header-sorted-icon-hover-color: mat-color($foreground, disabled-text) !default;
$data-table-divider-color: mat-color($foreground, text, .07) !default;
$data-table-hover-color: mat-color($background, 'hover') !default;
$data-table-selection-color: mat-color($background, 'selected-button') !default;
$data-table-dividers: 1px solid $data-table-divider-color !default;
$data-table-row-height: 56px !default;
// $data-table-last-row-height: 56px !default;
// $data-table-header-height: 56px !default;
$data-table-column-spacing: 36px !default;
$data-table-column-padding: $data-table-column-spacing / 2;
// $data-table-card-header-height: 64px !default;
// $data-table-card-title-top: 20px !default;
$data-table-card-padding: 24px !default;
// $data-table-button-padding-right: 16px !default;
$data-table-cell-top: $data-table-card-padding / 2;
$data-table-drag-border: 1px dashed rgb(68, 138, 255);
.adf-data-table {
width: 100%;
position: relative;
border: $data-table-dividers;
border-collapse: collapse;
white-space: nowrap;
font-size: $data-table-font-size;
/* Firefox fixes */
border-collapse: unset;
border-spacing: 0;
thead {
padding-bottom: 3px;
}
tbody {
tr {
cursor: pointer;
position: relative;
height: $data-table-row-height;
@include material-animation-default(0.28s);
transition-property: background-color;
&:hover {
background-color: $data-table-hover-color;
}
&.is-selected, &.is-selected:hover {
background-color: $data-table-selection-color;
}
&:focus {
outline-offset: -1px;
outline-width: 1px;
outline-color: rgb(68, 138, 255);
outline-style: solid;
}
&:last-child {
& > td {
border-bottom: $data-table-dividers;
}
}
}
}
td, th {
padding: 0 $data-table-column-padding 12px $data-table-column-padding;
text-align: right;
&:first-of-type {
padding-left: 24px;
}
&:last-of-type {
padding-right: 24px;
}
&:focus {
outline-offset: -1px;
outline-width: 1px;
outline-color: rgb(68, 138, 255);
outline-style: solid;
}
}
td {
color: mat-color($foreground, text);
position: relative;
vertical-align: middle;
height: $data-table-row-height;
border-top: $data-table-dividers;
padding-top: $data-table-cell-top;
box-sizing: border-box;
@include no-select;
}
th {
@include no-select;
cursor: pointer;
position: relative;
vertical-align: bottom;
text-overflow: ellipsis;
font-size: 14px;
font-weight: bold;
line-height: 24px;
letter-spacing: 0;
height: $data-table-row-height;
font-size: $data-table-header-font-size;
color: $data-table-header-color;
padding-bottom: 8px;
box-sizing: border-box;
&.sortable {
@include no-select;
&:hover {
cursor: pointer;
}
}
&.adf-data-table__header--sorted-asc,
&.adf-data-table__header--sorted-desc {
color: $data-table-header-sorted-color;
&:before {
@include typo-icon;
font-size: $data-table-header-sort-icon-size;
content: "\e5d8";
margin-right: 5px;
vertical-align: sub;
}
&:hover {
cursor: pointer;
&:before {
color: $data-table-header-sorted-icon-hover-color;
}
}
}
&.adf-data-table__header--sorted-desc:before {
content: "\e5db";
}
}
.adf-data-table-cell {
text-align: left;
height: 100%;
&--text {
text-align: left;
}
&--date {
text-align: left;
}
&--number {
text-align: right;
}
&--image {
.cell-value {
height: 24px;
}
text-align: left;
img {
height: 100%;
}
}
}
.full-width {
width: 100%;
}
/* Empty folder */
.adf-no-content-container {
padding: 0 !important;
& > img {
width: 100%;
}
}
/* Loading folder */
.adf-loading-content-container {
padding: 0 !important;
& > img {
width: 100%;
}
}
.adf-no-permission {
&__row:hover {
cursor: default;
background-color: inherit;
}
&__cell {
padding: 0 !important;
}
}
.ellipsis-cell {
.cell-container {
height: 100%;
}
.cell-container > * {
display: block;
position: absolute;
max-width: calc(100% - 2em);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.12em;
}
/* visible content */
.cell-value {
display: block;
position: relative;
max-width: calc(100% - 2em);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.12em;
}
/* cell stretching content */
& > div:after {
content: attr(title);
overflow: hidden;
height: 0;
display: block;
}
}
/* [Accessibility] For screen reader only */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
/* Utils */
.hidden {
display: none;
}
/* mobile phone */
@media all and (max-width: 768px) {
.desktop-only {
display: none;
}
}
@media (max-device-width: 768px) {
.desktop-only {
display: none;
}
}
}
.adf-upload__dragging {
& > td {
border-top: $data-table-drag-border;
border-bottom: $data-table-drag-border;
&:first-child {
border-left: $data-table-drag-border;
}
&:last-child {
border-right: $data-table-drag-border;
}
}
}
}

View File

@@ -0,0 +1,650 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { SimpleChange } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MatCheckboxChange } from '@angular/material';
import { RouterTestingModule } from '@angular/router/testing';
import { DataTableModule } from '../../datatable.module';
import { MaterialModule } from '../../../material.module';
import {
DataColumn,
DataRow,
DataSorting,
ObjectDataColumn,
ObjectDataTableAdapter
} from './../../data/index';
import { DataTableComponent } from './datatable.component';
describe('DataTable', () => {
let fixture: ComponentFixture<DataTableComponent>;
let dataTable: DataTableComponent;
let element: any;
let eventMock: any;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule,
DataTableModule,
MaterialModule
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DataTableComponent);
dataTable = fixture.componentInstance;
element = fixture.debugElement.nativeElement;
});
beforeEach(() => {
eventMock = {
preventDefault: function () {
}
};
});
it('should change the rows on changing of the data', () => {
let newData = new ObjectDataTableAdapter(
[
{ name: 'TEST' },
{ name: 'FAKE' }
],
[new ObjectDataColumn({ key: 'name' })]
);
dataTable.data = new ObjectDataTableAdapter(
[
{ name: '1' },
{ name: '2' }
],
[new ObjectDataColumn({ key: 'name' })]
);
dataTable.ngOnChanges({
data: new SimpleChange(null, newData, false)
});
fixture.detectChanges();
expect(element.querySelector('[data-automation-id="text_TEST"]')).not.toBeNull();
expect(element.querySelector('[data-automation-id="text_FAKE"]')).not.toBeNull();
});
it('should reset selection on mode change', () => {
spyOn(dataTable, 'resetSelection').and.callThrough();
dataTable.data = new ObjectDataTableAdapter(
[
{ name: '1' },
{ name: '2' }
],
[ new ObjectDataColumn({ key: 'name'}) ]
);
const rows = dataTable.data.getRows();
rows[0].isSelected = true;
rows[1].isSelected = true;
expect(rows[0].isSelected).toBeTruthy();
expect(rows[1].isSelected).toBeTruthy();
dataTable.ngOnChanges({
selectionMode: new SimpleChange(null, 'multiple', false)
});
expect(dataTable.resetSelection).toHaveBeenCalled();
});
it('should select only one row with [single] selection mode', () => {
dataTable.selectionMode = 'single';
dataTable.data = new ObjectDataTableAdapter(
[
{ name: '1' },
{ name: '2' }
],
[ new ObjectDataColumn({ key: 'name'}) ]
);
const rows = dataTable.data.getRows();
dataTable.ngOnChanges({});
dataTable.onRowClick(rows[0], null);
expect(rows[0].isSelected).toBeTruthy();
expect(rows[1].isSelected).toBeFalsy();
dataTable.onRowClick(rows[1], null);
expect(rows[0].isSelected).toBeFalsy();
expect(rows[1].isSelected).toBeTruthy();
});
it('should not unselect the row with [single] selection mode', () => {
dataTable.selectionMode = 'single';
dataTable.data = new ObjectDataTableAdapter(
[
{ name: '1' },
{ name: '2' }
],
[ new ObjectDataColumn({ key: 'name'}) ]
);
const rows = dataTable.data.getRows();
dataTable.ngOnChanges({});
dataTable.onRowClick(rows[0], null);
expect(rows[0].isSelected).toBeTruthy();
expect(rows[1].isSelected).toBeFalsy();
dataTable.onRowClick(rows[0], null);
expect(rows[0].isSelected).toBeTruthy();
expect(rows[1].isSelected).toBeFalsy();
});
it('should unselect the row with [multiple] selection mode and modifier key', () => {
dataTable.selectionMode = 'multiple';
dataTable.data = new ObjectDataTableAdapter(
[ { name: '1' } ],
[ new ObjectDataColumn({ key: 'name'}) ]
);
const rows = dataTable.data.getRows();
dataTable.ngOnChanges({});
dataTable.onRowClick(rows[0], null);
expect(rows[0].isSelected).toBeTruthy();
dataTable.onRowClick(rows[0], null);
expect(rows[0].isSelected).toBeTruthy();
dataTable.onRowClick(rows[0], <any> { metaKey: true, preventDefault() {} });
expect(rows[0].isSelected).toBeFalsy();
});
it('should select multiple rows with [multiple] selection mode', () => {
dataTable.selectionMode = 'multiple';
dataTable.data = new ObjectDataTableAdapter(
[
{ name: '1' },
{ name: '2' }
],
[ new ObjectDataColumn({ key: 'name'}) ]
);
const rows = dataTable.data.getRows();
const event = new MouseEvent('click', {
metaKey: true
});
dataTable.ngOnChanges({});
dataTable.onRowClick(rows[0], event);
dataTable.onRowClick(rows[1], event);
expect(rows[0].isSelected).toBeTruthy();
expect(rows[1].isSelected).toBeTruthy();
});
it('should put actions menu to the right by default', () => {
dataTable.data = new ObjectDataTableAdapter([], [
<DataColumn> {},
<DataColumn> {},
<DataColumn> {}
]);
dataTable.actions = true;
fixture.detectChanges();
let headers = element.querySelectorAll('th');
expect(headers.length).toBe(4);
expect(headers[headers.length - 1].classList.contains('actions-column')).toBeTruthy();
});
it('should put actions menu to the left', () => {
dataTable.data = new ObjectDataTableAdapter([], [
<DataColumn> {},
<DataColumn> {},
<DataColumn> {}
]);
dataTable.actions = true;
dataTable.actionsPosition = 'left';
fixture.detectChanges();
let headers = element.querySelectorAll('th');
expect(headers.length).toBe(4);
expect(headers[0].classList.contains('actions-column')).toBeTruthy();
});
it('should initialize default adapter', () => {
let table = new DataTableComponent(null, null);
expect(table.data).toBeUndefined();
table.ngOnChanges({'data': new SimpleChange('123', {}, true)});
expect(table.data).toEqual(jasmine.any(ObjectDataTableAdapter));
});
it('should load data table on onChange', () => {
let table = new DataTableComponent(null, null);
let data = new ObjectDataTableAdapter([], []);
expect(table.data).toBeUndefined();
table.ngOnChanges({'data': new SimpleChange('123', data, true)});
expect(table.data).toEqual(data);
});
it('should initialize with custom data', () => {
let data = new ObjectDataTableAdapter([], []);
dataTable.data = data;
dataTable.ngAfterContentInit();
expect(dataTable.data).toBe(data);
});
it('should emit row click event', done => {
let row = <DataRow> {};
dataTable.rowClick.subscribe(e => {
expect(e.value).toBe(row);
done();
});
dataTable.ngOnChanges({});
dataTable.onRowClick(row, null);
});
it('should emit double click if there are two single click in 250ms', (done) => {
let row = <DataRow> {};
dataTable.ngOnChanges({});
dataTable.rowDblClick.subscribe( () => {
done();
});
dataTable.onRowClick(row, null);
setTimeout(() => {
dataTable.onRowClick(row, null);
}
, 240);
});
it('should emit double click if there are more than two single click in 250ms', (done) => {
let row = <DataRow> {};
dataTable.ngOnChanges({});
dataTable.rowDblClick.subscribe( () => {
done();
});
dataTable.onRowClick(row, null);
setTimeout(() => {
dataTable.onRowClick(row, null);
dataTable.onRowClick(row, null);
}
, 240);
});
it('should emit single click if there are two single click in more than 250ms', (done) => {
let row = <DataRow> {};
let clickCount = 0;
dataTable.ngOnChanges({});
dataTable.rowClick.subscribe( () => {
clickCount += 1;
if (clickCount === 2) {
done();
}
});
dataTable.onRowClick(row, null);
setTimeout(() => {
dataTable.onRowClick(row, null);
}
, 260);
});
it('should emit row-click dom event', (done) => {
let row = <DataRow> {};
fixture.nativeElement.addEventListener('row-click', (e) => {
expect(e.detail.value).toBe(row);
done();
});
dataTable.ngOnChanges({});
dataTable.onRowClick(row, null);
});
it('should emit row-dblclick dom event', (done) => {
let row = <DataRow> {};
fixture.nativeElement.addEventListener('row-dblclick', (e) => {
expect(e.detail.value).toBe(row);
done();
});
dataTable.ngOnChanges({});
dataTable.onRowClick(row, null);
dataTable.onRowClick(row, null);
});
it('should prevent default behaviour on row click event', () => {
let e = jasmine.createSpyObj('event', ['preventDefault']);
dataTable.ngAfterContentInit();
dataTable.onRowClick(null, e);
expect(e.preventDefault).toHaveBeenCalled();
});
it('should prevent default behaviour on row double-click event', () => {
let e = jasmine.createSpyObj('event', ['preventDefault']);
dataTable.ngOnChanges({});
dataTable.ngAfterContentInit();
dataTable.onRowDblClick(null, e);
expect(e.preventDefault).toHaveBeenCalled();
});
it('should not sort if column is missing', () => {
dataTable.ngOnChanges({'data': new SimpleChange('123', {}, true)});
let adapter = dataTable.data;
spyOn(adapter, 'setSorting').and.callThrough();
dataTable.onColumnHeaderClick(null);
expect(adapter.setSorting).not.toHaveBeenCalled();
});
it('should not sort upon clicking non-sortable column header', () => {
dataTable.ngOnChanges({'data': new SimpleChange('123', {}, true)});
let adapter = dataTable.data;
spyOn(adapter, 'setSorting').and.callThrough();
let column = new ObjectDataColumn({
key: 'column_1'
});
dataTable.onColumnHeaderClick(column);
expect(adapter.setSorting).not.toHaveBeenCalled();
});
it('should set sorting upon column header clicked', () => {
dataTable.ngOnChanges({'data': new SimpleChange('123', {}, true)});
let adapter = dataTable.data;
spyOn(adapter, 'setSorting').and.callThrough();
let column = new ObjectDataColumn({
key: 'column_1',
sortable: true
});
dataTable.onColumnHeaderClick(column);
expect(adapter.setSorting).toHaveBeenCalledWith(
jasmine.objectContaining({
key: 'column_1',
direction: 'asc'
})
);
});
it('should invert sorting upon column header clicked', () => {
dataTable.ngOnChanges({'data': new SimpleChange('123', {}, true)});
let adapter = dataTable.data;
let sorting = new DataSorting('column_1', 'asc');
spyOn(adapter, 'setSorting').and.callThrough();
spyOn(adapter, 'getSorting').and.returnValue(sorting);
let column = new ObjectDataColumn({
key: 'column_1',
sortable: true
});
// check first click on the header
dataTable.onColumnHeaderClick(column);
expect(adapter.setSorting).toHaveBeenCalledWith(
jasmine.objectContaining({
key: 'column_1',
direction: 'desc'
})
);
// check second click on the header
sorting.direction = 'desc';
dataTable.onColumnHeaderClick(column);
expect(adapter.setSorting).toHaveBeenCalledWith(
jasmine.objectContaining({
key: 'column_1',
direction: 'asc'
})
);
});
it('should invert "select all" status', () => {
expect(dataTable.isSelectAllChecked).toBeFalsy();
dataTable.onSelectAllClick(<MatCheckboxChange> { checked: true });
expect(dataTable.isSelectAllChecked).toBeTruthy();
dataTable.onSelectAllClick(<MatCheckboxChange> { checked: false });
expect(dataTable.isSelectAllChecked).toBeFalsy();
});
it('should update rows on "select all" click', () => {
let data = new ObjectDataTableAdapter([{}, {}, {}], []);
let rows = data.getRows();
dataTable.data = data;
dataTable.multiselect = true;
dataTable.ngAfterContentInit();
dataTable.onSelectAllClick(<MatCheckboxChange> { checked: true });
expect(dataTable.isSelectAllChecked).toBe(true);
for (let i = 0; i < rows.length; i++) {
expect(rows[i].isSelected).toBe(true);
}
dataTable.onSelectAllClick(<MatCheckboxChange> { checked: false });
expect(dataTable.isSelectAllChecked).toBe(false);
for (let i = 0; i < rows.length; i++) {
expect(rows[i].isSelected).toBe(false);
}
});
it('should allow "select all" calls with no rows', () => {
dataTable.multiselect = true;
dataTable.ngOnChanges({'data': new SimpleChange('123', {}, true)});
dataTable.onSelectAllClick(<MatCheckboxChange> { checked: true });
expect(dataTable.isSelectAllChecked).toBe(true);
});
it('should require multiselect option to toggle row state', () => {
let data = new ObjectDataTableAdapter([{}, {}, {}], []);
let rows = data.getRows();
dataTable.data = data;
dataTable.multiselect = false;
dataTable.ngAfterContentInit();
dataTable.onSelectAllClick(<MatCheckboxChange> { checked: true });
expect(dataTable.isSelectAllChecked).toBe(true);
for (let i = 0; i < rows.length; i++) {
expect(rows[i].isSelected).toBe(false);
}
});
it('should require row and column for icon value check', () => {
expect(dataTable.isIconValue(null, null)).toBeFalsy();
expect(dataTable.isIconValue(<DataRow> {}, null)).toBeFalsy();
expect(dataTable.isIconValue(null, <DataColumn> {})).toBeFalsy();
});
it('should use special material url scheme', () => {
let column = <DataColumn> {};
let row = {
getValue: function (key: string) {
return 'material-icons://android';
}
};
expect(dataTable.isIconValue(<DataRow> row, column)).toBeTruthy();
});
it('should not use special material url scheme', () => {
let column = <DataColumn> {};
let row = {
getValue: function (key: string) {
return 'http://www.google.com';
}
};
expect(dataTable.isIconValue(<DataRow> row, column)).toBeFalsy();
});
it('should parse icon value', () => {
let column = <DataColumn> {};
let row = {
getValue: function (key: string) {
return 'material-icons://android';
}
};
expect(dataTable.asIconValue(<DataRow> row, column)).toBe('android');
});
it('should not parse icon value', () => {
let column = <DataColumn> {};
let row = {
getValue: function (key: string) {
return 'http://www.google.com';
}
};
expect(dataTable.asIconValue(<DataRow> row, column)).toBe(null);
});
it('should parse icon values to a valid i18n key', () => {
expect(dataTable.iconAltTextKey('custom')).toBe('ICONS.custom');
expect(dataTable.iconAltTextKey('/path/to/custom')).toBe('ICONS.custom');
expect(dataTable.iconAltTextKey('/path/to/custom.svg')).toBe('ICONS.custom');
});
it('should require column and direction to evaluate sorting state', () => {
expect(dataTable.isColumnSorted(null, null)).toBeFalsy();
expect(dataTable.isColumnSorted(<DataColumn> {}, null)).toBeFalsy();
expect(dataTable.isColumnSorted(null, 'asc')).toBeFalsy();
});
it('should require adapter sorting to evaluate sorting state', () => {
dataTable.ngOnChanges({'data': new SimpleChange('123', {}, true)});
spyOn(dataTable.data, 'getSorting').and.returnValue(null);
expect(dataTable.isColumnSorted(<DataColumn> {}, 'asc')).toBeFalsy();
});
it('should evaluate column sorting state', () => {
dataTable.ngOnChanges({'data': new SimpleChange('123', {}, true)});
spyOn(dataTable.data, 'getSorting').and.returnValue(new DataSorting('column_1', 'asc'));
expect(dataTable.isColumnSorted(<DataColumn> {key: 'column_1'}, 'asc')).toBeTruthy();
expect(dataTable.isColumnSorted(<DataColumn> {key: 'column_2'}, 'desc')).toBeFalsy();
});
it('should replace image source with fallback thumbnail on error', () => {
let event = <any> {
target: {
src: 'missing-image'
}
};
dataTable.fallbackThumbnail = '<fallback>';
dataTable.onImageLoadingError(event);
expect(event.target.src).toBe(dataTable.fallbackThumbnail);
});
it('should replace image source only when fallback available', () => {
const originalSrc = 'missing-image';
let event = <any> {
target: {
src: originalSrc
}
};
dataTable.fallbackThumbnail = null;
dataTable.onImageLoadingError(event);
expect(event.target.src).toBe(originalSrc);
});
it('should not get cell tooltip when row is not provided', () => {
const col = <DataColumn> { key: 'name', type: 'text' };
expect(dataTable.getCellTooltip(null, col)).toBeNull();
});
it('should not get cell tooltip when column is not provided', () => {
const row = <DataRow> {};
expect(dataTable.getCellTooltip(row, null)).toBeNull();
});
it('should not get cell tooltip when formatter is not provided', () => {
const col = <DataColumn> { key: 'name', type: 'text' };
const row = <DataRow> {};
expect(dataTable.getCellTooltip(row, col)).toBeNull();
});
it('should use formatter function to generate tooltip', () => {
const tooltip = 'tooltip value';
const col = <DataColumn> {
key: 'name',
type: 'text',
formatTooltip: () => tooltip
};
const row = <DataRow> {};
expect(dataTable.getCellTooltip(row, col)).toBe(tooltip);
});
it('should return null value from the tooltip formatter', () => {
const col = <DataColumn> {
key: 'name',
type: 'text',
formatTooltip: () => null
};
const row = <DataRow> {};
expect(dataTable.getCellTooltip(row, col)).toBeNull();
});
it('should cache the rows menu', () => {
let emitted = 0;
dataTable.showRowActionsMenu.subscribe(() => { emitted++; });
const column = <DataColumn> {};
const row = <DataRow> { getValue: function (key: string) { return 'id'; } };
dataTable.getRowActions(row, column);
dataTable.getRowActions(row, column);
dataTable.getRowActions(row, column);
expect(emitted).toBe(1);
});
it('should reset the menu cache after rows change', () => {
let emitted = 0;
dataTable.showRowActionsMenu.subscribe(() => { emitted++; });
const column = <DataColumn> {};
const row = <DataRow> { getValue: function (key: string) { return 'id'; } };
dataTable.getRowActions(row, column);
dataTable.ngOnChanges({'data': new SimpleChange('123', {}, true)});
dataTable.getRowActions(row, column);
expect(emitted).toBe(2);
});
});

View File

@@ -0,0 +1,490 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 {
AfterContentInit, Component, ContentChild, DoCheck, ElementRef, EventEmitter, Input,
IterableDiffers, OnChanges, Output, SimpleChange, SimpleChanges, TemplateRef, ViewEncapsulation
} from '@angular/core';
import { MatCheckboxChange } from '@angular/material';
import { Observable, Observer, Subscription } from 'rxjs/Rx';
import { DataColumnListComponent } from '../../../data-column';
import { DataColumn } from '../../data/data-column.model';
import { DataRowEvent } from '../../data/data-row-event.model';
import { DataRow } from '../../data/data-row.model';
import { DataSorting } from '../../data/data-sorting.model';
import { DataTableAdapter } from '../../data/datatable-adapter';
import { ObjectDataRow, ObjectDataTableAdapter } from '../../data/object-datatable-adapter';
import { DataCellEvent } from './data-cell.event';
import { DataRowActionEvent } from './data-row-action.event';
@Component({
selector: 'adf-datatable',
styleUrls: ['./datatable.component.scss'],
templateUrl: './datatable.component.html',
encapsulation: ViewEncapsulation.None
})
export class DataTableComponent implements AfterContentInit, OnChanges, DoCheck {
@ContentChild(DataColumnListComponent) columnList: DataColumnListComponent;
@Input()
data: DataTableAdapter;
@Input()
rows: any[] = [];
@Input()
selectionMode: string = 'single'; // none|single|multiple
@Input()
multiselect: boolean = false;
@Input()
actions: boolean = false;
@Input()
actionsPosition: string = 'right'; // left|right
@Input()
fallbackThumbnail: string;
@Input()
contextMenu: boolean = false;
@Input()
allowDropFiles: boolean = false;
@Input()
rowStyle: string;
@Input()
rowStyleClass: string = '';
@Input()
showHeader: boolean = true;
@Output()
rowClick = new EventEmitter<DataRowEvent>();
@Output()
rowDblClick = new EventEmitter<DataRowEvent>();
@Output()
showRowContextMenu = new EventEmitter<DataCellEvent>();
@Output()
showRowActionsMenu = new EventEmitter<DataCellEvent>();
@Output()
executeRowAction = new EventEmitter<DataRowActionEvent>();
@Input()
loading: boolean = false;
@Input()
noPermission: boolean = false;
noContentTemplate: TemplateRef<any>;
noPermissionTemplate: TemplateRef<any>;
loadingTemplate: TemplateRef<any>;
isSelectAllChecked: boolean = false;
selection = new Array<DataRow>();
private clickObserver: Observer<DataRowEvent>;
private click$: Observable<DataRowEvent>;
private schema: DataColumn[] = [];
private differ: any;
private rowMenuCache: object = {};
private singleClickStreamSub: Subscription;
private multiClickStreamSub: Subscription;
constructor(private elementRef: ElementRef, differs: IterableDiffers) {
if (differs) {
this.differ = differs.find([]).create(null);
}
this.click$ = new Observable<DataRowEvent>(observer => this.clickObserver = observer).share();
}
ngAfterContentInit() {
this.setTableSchema();
}
ngOnChanges(changes: SimpleChanges) {
this.initAndSubscribeClickStream();
if (this.isPropertyChanged(changes['data'])) {
if (this.isTableEmpty()) {
this.initTable();
} else {
this.data = changes['data'].currentValue;
}
return;
}
if (this.isPropertyChanged(changes['rows'])) {
if (this.isTableEmpty()) {
this.initTable();
} else {
this.setTableRows(changes['rows'].currentValue);
}
return;
}
if (changes.selectionMode && !changes.selectionMode.isFirstChange()) {
this.resetSelection();
this.emitRowSelectionEvent('row-unselect', null);
}
}
ngDoCheck() {
let changes = this.differ.diff(this.rows);
if (changes) {
this.setTableRows(this.rows);
}
}
isPropertyChanged(property: SimpleChange): boolean {
return property && property.currentValue ? true : false;
}
convertToRowsData(rows: any []): ObjectDataRow[] {
return rows.map(row => new ObjectDataRow(row));
}
private initAndSubscribeClickStream() {
this.unsubscribeClickStream();
let singleClickStream = this.click$
.buffer(this.click$.debounceTime(250))
.map(list => list)
.filter(x => x.length === 1);
this.singleClickStreamSub = singleClickStream.subscribe((obj: DataRowEvent[]) => {
let event: DataRowEvent = obj[0];
this.rowClick.emit(event);
if (!event.defaultPrevented) {
this.elementRef.nativeElement.dispatchEvent(
new CustomEvent('row-click', {
detail: event,
bubbles: true
})
);
}
});
let multiClickStream = this.click$
.buffer(this.click$.debounceTime(250))
.map(list => list)
.filter(x => x.length >= 2);
this.multiClickStreamSub = multiClickStream.subscribe((obj: DataRowEvent[]) => {
let event: DataRowEvent = obj[0];
this.rowDblClick.emit(event);
if (!event.defaultPrevented) {
this.elementRef.nativeElement.dispatchEvent(
new CustomEvent('row-dblclick', {
detail: event,
bubbles: true
})
);
}
});
}
private unsubscribeClickStream() {
if (this.singleClickStreamSub) {
this.singleClickStreamSub.unsubscribe();
}
if (this.multiClickStreamSub) {
this.multiClickStreamSub.unsubscribe();
}
}
private initTable() {
this.data = new ObjectDataTableAdapter(this.rows, this.schema);
this.rowMenuCache = {};
}
isTableEmpty() {
return this.data === undefined || this.data === null;
}
private setTableRows(rows) {
if (this.data) {
this.data.setRows(this.convertToRowsData(rows));
}
}
private setTableSchema() {
if (this.columnList && this.columnList.columns) {
this.schema = this.columnList.columns.map(c => <DataColumn> c);
}
if (this.data && this.schema && this.schema.length > 0) {
this.data.setColumns(this.schema);
}
}
onRowClick(row: DataRow, e: MouseEvent) {
if (e) {
e.preventDefault();
}
if (row) {
if (this.data) {
if (this.isSingleSelectionMode()) {
this.resetSelection();
this.selectRow(row, true);
this.emitRowSelectionEvent('row-select', row);
}
if (this.isMultiSelectionMode()) {
const modifier = e && (e.metaKey || e.ctrlKey);
const newValue = modifier ? !row.isSelected : true;
const domEventName = newValue ? 'row-select' : 'row-unselect';
if (!modifier) {
this.resetSelection();
}
this.selectRow(row, newValue);
this.emitRowSelectionEvent(domEventName, row);
}
}
const dataRowEvent = new DataRowEvent(row, e, this);
this.clickObserver.next(dataRowEvent);
}
}
resetSelection(): void {
if (this.data) {
const rows = this.data.getRows();
if (rows && rows.length > 0) {
rows.forEach(r => r.isSelected = false);
}
this.selection.splice(0);
}
this.isSelectAllChecked = false;
}
onRowDblClick(row: DataRow, e?: Event) {
if (e) {
e.preventDefault();
}
let dataRowEvent = new DataRowEvent(row, e, this);
this.clickObserver.next(dataRowEvent);
}
onRowKeyUp(row: DataRow, e: KeyboardEvent) {
const event = new CustomEvent('row-keyup', {
detail: {
row: row,
keyboardEvent: e,
sender: this
},
bubbles: true
});
this.elementRef.nativeElement.dispatchEvent(event);
if (event.defaultPrevented) {
e.preventDefault();
} else {
if (e.key === 'Enter') {
this.onKeyboardNavigate(row, e);
}
}
}
private onKeyboardNavigate(row: DataRow, e: KeyboardEvent) {
if (e) {
e.preventDefault();
}
const event = new DataRowEvent(row, e, this);
this.rowDblClick.emit(event);
this.elementRef.nativeElement.dispatchEvent(
new CustomEvent('row-dblclick', {
detail: event,
bubbles: true
})
);
}
onColumnHeaderClick(column: DataColumn) {
if (column && column.sortable) {
let current = this.data.getSorting();
let newDirection = 'asc';
if (current && column.key === current.key) {
newDirection = current.direction === 'asc' ? 'desc' : 'asc';
}
this.data.setSorting(new DataSorting(column.key, newDirection));
}
}
onSelectAllClick(e: MatCheckboxChange) {
this.isSelectAllChecked = e.checked;
if (this.multiselect) {
let rows = this.data.getRows();
if (rows && rows.length > 0) {
for (let i = 0; i < rows.length; i++) {
this.selectRow(rows[i], e.checked);
}
}
const domEventName = e.checked ? 'row-select' : 'row-unselect';
const row = this.selection.length > 0 ? this.selection[0] : null;
this.emitRowSelectionEvent(domEventName, row);
}
}
onCheckboxChange(row: DataRow, event: MatCheckboxChange) {
const newValue = event.checked;
this.selectRow(row, newValue);
const domEventName = newValue ? 'row-select' : 'row-unselect';
this.emitRowSelectionEvent(domEventName, row);
}
onImageLoadingError(event: Event) {
if (event && this.fallbackThumbnail) {
let element = <any> event.target;
element.src = this.fallbackThumbnail;
}
}
isIconValue(row: DataRow, col: DataColumn): boolean {
if (row && col) {
let value = row.getValue(col.key);
return value && value.startsWith('material-icons://');
}
return false;
}
asIconValue(row: DataRow, col: DataColumn): string {
if (this.isIconValue(row, col)) {
let value = row.getValue(col.key) || '';
return value.replace('material-icons://', '');
}
return null;
}
iconAltTextKey(value: string): string {
return value ? 'ICONS.' + value.substring(value.lastIndexOf('/') + 1).replace(/\.[a-z]+/, '') : '';
}
isColumnSorted(col: DataColumn, direction: string): boolean {
if (col && direction) {
let sorting = this.data.getSorting();
return sorting && sorting.key === col.key && sorting.direction === direction;
}
return false;
}
getContextMenuActions(row: DataRow, col: DataColumn): any[] {
let event = new DataCellEvent(row, col, []);
this.showRowContextMenu.emit(event);
return event.value.actions;
}
getRowActions(row: DataRow, col: DataColumn): any[] {
const id = row.getValue('id');
if (!this.rowMenuCache[id]) {
let event = new DataCellEvent(row, col, []);
this.showRowActionsMenu.emit(event);
this.rowMenuCache[id] = event.value.actions;
}
return this.rowMenuCache[id];
}
onExecuteRowAction(row: DataRow, action: any) {
if (action.disabled || action.disabled) {
event.stopPropagation();
} else {
this.executeRowAction.emit(new DataRowActionEvent(row, action));
}
}
rowAllowsDrop(row: DataRow): boolean {
return row.isDropTarget === true;
}
hasSelectionMode(): boolean {
return this.isSingleSelectionMode() || this.isMultiSelectionMode();
}
isSingleSelectionMode(): boolean {
return this.selectionMode && this.selectionMode.toLowerCase() === 'single';
}
isMultiSelectionMode(): boolean {
return this.selectionMode && this.selectionMode.toLowerCase() === 'multiple';
}
getRowStyle(row: DataRow): string {
row.cssClass = row.cssClass ? row.cssClass : '';
this.rowStyleClass = this.rowStyleClass ? this.rowStyleClass : '';
return `${row.cssClass} ${this.rowStyleClass}`;
}
private selectRow(row: DataRow, value: boolean) {
if (row) {
row.isSelected = value;
const idx = this.selection.indexOf(row);
if (value) {
if (idx < 0) {
this.selection.push(row);
}
} else {
if (idx > -1) {
this.selection.splice(idx, 1);
}
}
}
}
getCellTooltip(row: DataRow, col: DataColumn): string {
if (row && col && col.formatTooltip) {
const result: string = col.formatTooltip(row, col);
if (result) {
return result;
}
}
return null;
}
private emitRowSelectionEvent(name: string, row: DataRow) {
const domEvent = new CustomEvent(name, {
detail: {
row: row,
selection: this.selection
},
bubbles: true
});
this.elementRef.nativeElement.dispatchEvent(domEvent);
}
}

View File

@@ -0,0 +1,32 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
import { DataTableCellComponent } from './datatable-cell.component';
@Component({
selector: 'adf-date-cell',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<ng-container>
<span [title]="tooltip">{{value}}</span>
</ng-container>
`,
encapsulation: ViewEncapsulation.None,
host: { class: 'adf-date-cell' }
})
export class DateCellComponent extends DataTableCellComponent {}

View File

@@ -0,0 +1,6 @@
<div class="adf-empty-list_template">
<ng-content select="[adf-empty-list-header]"></ng-content>
<ng-content select="[adf-empty-list-body]"></ng-content>
<ng-content select="[adf-empty-list-footer]"></ng-content>
<ng-content></ng-content>
</div>

View File

@@ -0,0 +1,5 @@
.adf-empty-list_template {
text-align: center;
margin-top: 20px;
margin-bottom: 20px;
}

View File

@@ -0,0 +1,47 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { EmptyListComponent } from './empty-list.component';
describe('EmptyListComponentComponent', () => {
let component: EmptyListComponent;
let fixture: ComponentFixture<EmptyListComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
EmptyListComponent
]
}).compileComponents();
fixture = TestBed.createComponent(EmptyListComponent);
component = fixture.componentInstance;
}));
it('should be defined', () => {
expect(component).toBeDefined();
});
it('should render the input values', async(() => {
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(fixture.nativeElement.querySelector('.adf-empty-list_template')).toBeDefined();
});
}));
});

View File

@@ -0,0 +1,30 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { Component, Directive, ViewEncapsulation } from '@angular/core';
@Component({
selector: 'adf-empty-list',
styleUrls: ['./empty-list.component.scss'],
templateUrl: './empty-list.component.html',
encapsulation: ViewEncapsulation.None
})
export class EmptyListComponent {}
@Directive({ selector: '[adf-empty-list-header]' }) export class EmptyListHeaderDirective {}
@Directive({ selector: '[adf-empty-list-body]' }) export class EmptyListBodyDirective {}
@Directive({ selector: '[adf-empty-list-footer]' }) export class EmptyListFooterDirective {}

View File

@@ -0,0 +1,32 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
import { DataTableCellComponent } from './datatable-cell.component';
@Component({
selector: 'adf-filesize-cell',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<ng-container>
<span [title]="tooltip">{{ value | adfFileSize }}</span>
</ng-container>
`,
encapsulation: ViewEncapsulation.None,
host: { class: 'adf-filesize-cell' }
})
export class FileSizeCellComponent extends DataTableCellComponent {}

View File

@@ -0,0 +1,132 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import {
ObjectDataColumn,
ObjectDataTableAdapter
} from './../../data/index';
import { LocationCellComponent } from './location-cell.component';
describe('LocationCellComponent', () => {
let component: LocationCellComponent;
let fixture: ComponentFixture<LocationCellComponent>;
let dataTableAdapter: ObjectDataTableAdapter;
let rowData;
let columnData;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
LocationCellComponent
]
}).compileComponents();
fixture = TestBed.createComponent(LocationCellComponent);
component = fixture.componentInstance;
}));
beforeEach(() => {
rowData = {
name: '1',
path: {
elements: [
{ id: '1', name: 'path' },
{ id: '2', name: 'to' },
{ id: '3', name: 'location' }
],
name: '/path/to/location'
}
};
columnData = { format: '/somewhere', type: 'location', key: 'path'};
dataTableAdapter = new ObjectDataTableAdapter(
[rowData],
[ new ObjectDataColumn(columnData) ]
);
component.link = [];
component.column = dataTableAdapter.getColumns()[0];
component.data = dataTableAdapter;
component.row = dataTableAdapter.getRows()[0];
});
it('should set displayText', () => {
fixture.detectChanges();
expect(component.displayText).toBe('location');
});
it('should set tooltip', () => {
fixture.detectChanges();
expect(component.tooltip).toEqual(rowData.path.name);
});
it('should set router link', () => {
fixture.detectChanges();
expect(component.link).toEqual([ columnData.format , rowData.path.elements[2].id ]);
});
it('should not setup cell when path has no data', () => {
rowData.path = {};
fixture.detectChanges();
expect(component.displayText).toBe('');
expect(component.tooltip).toBeUndefined();
expect(component.link).toEqual([]);
});
it('should not setup cell when path is missing required properties', () => {
rowData.path = { someProp: '' };
fixture.detectChanges();
expect(component.displayText).toBe('');
expect(component.tooltip).toBeUndefined();
expect(component.link).toEqual([]);
});
it('should not setup cell when path data is missing one of the property', () => {
rowData.path = {
name: 'some-name'
};
fixture.detectChanges();
expect(component.displayText).toBe('');
expect(component.tooltip).toBeUndefined();
expect(component.link).toEqual([]);
rowData.path = {
elements: []
};
fixture.detectChanges();
expect(component.displayText).toBe('');
expect(component.tooltip).toBeUndefined();
expect(component.link).toEqual([]);
});
});

View File

@@ -0,0 +1,61 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed 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 { ChangeDetectionStrategy, Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
import { PathInfoEntity } from 'alfresco-js-api';
import { DataTableCellComponent } from './datatable-cell.component';
@Component({
selector: 'adf-location-cell',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<ng-container>
<a href="" [title]="tooltip" [routerLink]="link">
{{ displayText }}
</a>
</ng-container>
`,
encapsulation: ViewEncapsulation.None,
host: { class: 'adf-location-cell' }
})
export class LocationCellComponent extends DataTableCellComponent implements OnInit {
@Input()
link: any[];
@Input()
displayText: string = '';
/** @override */
ngOnInit() {
if (!this.value && this.column && this.column.key && this.row && this.data) {
const path: PathInfoEntity = this.data.getValue(this.row, this.column);
if (path && path.name && path.elements) {
this.value = path;
this.displayText = path.name.split('/').pop();
if (!this.tooltip) {
this.tooltip = path.name;
}
const parent = path.elements[path.elements.length - 1];
this.link = [ this.column.format, parent.id ];
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More