// @tag dom,core
/* eslint-disable max-len */
/**
* An Identifiable mixin.
* @private
*/
Ext.define('Ext.mixin.Identifiable', function(Identifiable) { return { // eslint-disable-line brace-style
/* eslint-enable max-len */
isIdentifiable: true,
mixinId: 'identifiable',
/**
* Retrieves the `id`. This method Will auto-generate an id if one has not already
* been configured.
* @return {String} id
*/
getId: function() {
var me = this,
id = me.id,
cfg;
if (!(id || id === 0)) {
cfg = me.initialConfig;
// The id config can be requested so early (e.g., by stateful) that the
// property has not been put on the instance yet.
if (cfg && cfg.id) {
id = cfg.id;
}
else {
id = me.generateAutoId();
me.autoGenId = true;
}
me.setId(id);
}
me.getId = Identifiable._getId;
return id;
},
setId: function(id) {
// The double assignment here and in setId is intentional to workaround a JIT
// issue that prevents me.id from being assigned in random scenarios. The issue
// occurs on 4th gen iPads and lower, possibly other older iOS devices.
// See EXTJS-16494.
this.id = this.id = id;
},
privates: {
statics: {
_idCleanRe: /\.|[^\w-]/g,
uniqueIds: {},
_getId: function() {
return this.id;
}
},
defaultIdPrefix: 'ext-',
defaultIdSeparator: '-',
id: null,
/**
* @property {Boolean} autoGenId
* `true` indicates an `id` was auto-generated rather than provided by configuration.
* @private
* @since 6.7.0
*/
autoGenId: false,
generateAutoId: function() {
var me = this,
prototype = me.self.prototype,
sep = me.defaultIdSeparator,
uniqueIds = Identifiable.uniqueIds,
cleanRe, defaultIdPrefix, prefix, xtype;
if (!prototype.hasOwnProperty('identifiablePrefix')) {
cleanRe = Identifiable._idCleanRe;
defaultIdPrefix = me.defaultIdPrefix;
xtype = me.xtype;
if (xtype) {
prefix = defaultIdPrefix + xtype.replace(cleanRe, sep) + sep;
}
else if (!(prefix = prototype.$className)) {
prefix = defaultIdPrefix + 'anonymous' + sep;
}
else {
prefix = prefix.replace(cleanRe, sep).toLowerCase() + sep;
}
prototype.identifiablePrefix = prefix;
}
prefix = me.identifiablePrefix;
if (!uniqueIds.hasOwnProperty(prefix)) {
uniqueIds[prefix] = 0;
}
return prefix + (++uniqueIds[prefix]);
}
} // privates
};
});