@gmetrixr/rjson
Version:
(R)ecursive Json
66 lines (65 loc) • 3.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const r_1 = require("../../../r");
const elements_1 = require("../../../r/definitions/elements");
const rules_1 = require("../../../r/definitions/rules");
const VariableTypes_1 = require("../../../r/definitions/variables/VariableTypes");
/**
* For media upload element, there is a predefined variable which gets populated when a viewer uploads media.
* Since there is only one such predefined var, this restricts it to only one upload per view.
*
* Changed flow:
* - delink the predefined variable from the media upload element for older projects and add separate var for each
* - create a new variable at run-time for any future media upload elements
*/
class Migration {
execute(projectJson) {
const pJson = projectJson;
const projectF = r_1.r.record(pJson);
const mediaUploadVar = projectF.getRecord(r_1.RT.variable, -4); // -4 is the id for predefined var media_upload_uri
if (mediaUploadVar !== undefined) {
// change record id from -4 to 3000, set var_category=autogenerated
projectF.changeRecordId(r_1.RT.variable, -4, 3000);
r_1.r.record(mediaUploadVar).set(r_1.rtp.variable.var_category, VariableTypes_1.VarCategory.autogenerated);
// for each media upload element, set its media_upload_var_id as 3000
projectF.getAllDeepChildren(r_1.RT.element).forEach(e => {
if (e.props.element_type === elements_1.ElementType.media_upload) {
r_1.r.record(e).set(r_1.rtp.element.media_upload_var_id, 3000);
}
});
// delete all *autogenerated* media upload rules for when "submit" is clicked
// these do not show up on the UI
const rulesIdsToDelete = projectF.getAllDeepChildrenIdsWithFilter(r_1.RT.rule, (ruleJson) => {
if (ruleJson.props.events_and === undefined && ruleJson.props.accent_color === undefined) {
const whenEvent = r_1.r.record(ruleJson).getRecords(r_1.RT.when_event)[0];
if (whenEvent.props.event === rules_1.RuleEvent.on_successful_upload && whenEvent.props.co_type === elements_1.ElementType.media_upload) {
const thenActions = r_1.r.record(ruleJson).getRecords(r_1.RT.then_action);
for (const ta of thenActions) {
if (ta.props.co_id && ta.props.co_id === -4) {
return true;
}
}
}
}
return false;
});
for (const ruleId of rulesIdsToDelete) {
projectF.deleteDeepRecord(r_1.RT.rule, ruleId);
}
// update when_events and then_actions which might be using this variable
projectF.getAllDeepChildren(r_1.RT.then_action).forEach(ta => {
if (ta.props.co_id && ta.props.co_id === -4) {
r_1.r.record(ta).set(r_1.rtp.then_action.co_id, 3000);
}
});
projectF.getAllDeepChildren(r_1.RT.when_event).forEach(we => {
if (we.props.co_id && we.props.co_id === -4) {
r_1.r.record(we).set(r_1.rtp.when_event.co_id, 3000);
}
});
}
projectF.set(r_1.rtp.project.version, 116);
}
}
const migration = new Migration();
exports.default = migration;