update from RIFT as of 696b75d2fe9fb046261b08c616f1bcf6c0b54a9b third try
[osm/UI.git] / skyquake / plugins / composer / src / src / libraries / UniqueId.js
1 /**
2 * Created by onvelocity on 2/12/16.
3 */
4 'use strict';
5 import d3 from 'd3'
6 import guid from './guid'
7 import DescriptorModel from './model/DescriptorModel'
8 export default class UID {
9
10 static get propertyName() {
11 return ':uid';
12 }
13
14 static create() {
15 return guid();
16 }
17
18 static from(obj) {
19 if (!obj || /undefined|null/.test(obj)) {
20 return;
21 }
22 if (obj instanceof DescriptorModel) {
23 // a descriptor instance
24 return obj.uid;
25 }
26 if (obj.dataset && obj.dataset.uid) {
27 // DOM Element
28 obj = obj.dataset.uid;
29 } else if (obj.__data__ && obj.__data__.uid) {
30 // d3 managed element
31 obj = obj.__data__.uid;
32 } else if (obj instanceof Element) {
33 obj = d3.select(obj).attr('data-uid');
34 }
35 if (!obj || /undefined|null/.test(obj)) {
36 return;
37 }
38 const uid = typeof obj === 'object' ? obj[UID.propertyName] || (obj.uiState && obj.uiState[UID.propertyName]) : obj;
39 if (typeof uid === 'string') {
40 return uid;
41 }
42 }
43
44 static hasUniqueId(obj) {
45 return !!UID.from(obj);
46 }
47
48 static assignUniqueId(obj, uid = null) {
49 if (!obj || /undefined|null/.test(obj)) {
50 return;
51 }
52 uid = uid || UID.create();
53 if (obj.uiState) {
54 obj.uiState[UID.propertyName] = uid;
55 } else {
56 obj[UID.propertyName] = uid;
57 }
58 }
59
60 }