frappe.provide("zfile.ui");
const get_root_and_root_folder = () => {
let root = '';
let root_folder = {};
let route = frappe.get_route();
let folder_manager = route.length >= 2 ? route[1] : null;
if (folder_manager) {
frappe.call({
method:"frappe.client.get",
args:{
doctype: "Folder Manage",
name: folder_manager
},
async:false,
callback: function (r) {
if (r["message"]) {
root_folder = r.message;
root = url_validate((r.message.parent_path?r.message.parent_path:'') +(r.message.path?r.message.path:''));
}
}
});
}
return [root, root_folder]
};
frappe.pages['zfile_manager'].on_page_load = function(wrapper) {
const page = frappe.ui.make_app_page({
parent: wrapper,
title: 'File Manager',
single_column: true
});
page.add_menu_item(__("Add to Desktop"), function () {
frappe.add_to_desktop(page.title, 'File')
});
let root_and_folder = get_root_and_root_folder();
frappe.model.with_doctype('File', function() {
wrapper.ZFile = new frappe.ZfileList({
// method: 'frappe.desk.reportview.get',
wrapper: wrapper,
page: wrapper.page,
no_loading: true,
root:root_and_folder[0],
root_folder:root_and_folder[1]
});
});
};
frappe.pages['zfile_manager'].refresh = function (wrapper) {
let root_and_folder = get_root_and_root_folder();
let checklistInt = setInterval (()=> {
if (typeof wrapper.ZFile !== 'undefined'){
if (root_and_folder[0] !== wrapper.ZFile.root){
wrapper.ZFile.root = root_and_folder[0];
wrapper.ZFile.root_folder = root_and_folder[1];
wrapper.ZFile.run_manager();
}else if (!wrapper.ZFile.runed) {
wrapper.ZFile.run_manager();
}
clearInterval(checklistInt)
}
})
};
frappe.ZfileList = frappe.ui.BaseList.extend({
init: function(opts) {
$.extend(this, opts);
this.runed = false;
this.rows_html = {};
this.filters = {};
this.page_length = 20;
this.start = 0;
this.cur_page = 1;
this.no_result_message = 'No Files to Display';
this.default_setup();
this.init_instruction_view();
if (this.root) {
const me = this;
// setup listing
me.make({
doctype: 'File',
page: me.page,
method: 'image_processing_com.z_file_manager.get_list',
args: me.get_args,
parent: me.page.main,
// start: 0,
show_filters: true
});
this.render_header();
}
},
run_manager() {
this.permissions = {};
this.set_permissions();
if (!this.check_permission('can_read')) {
frappe.set_route('/')
}
this.set_page_title();
this.filter_list.clear_filters();
this.filter_list.add_filter("File", "folder", "=", this.root);
this.run();
this.get_all_employees();
this.generated_multi_assign = false;
this.render_buttons();
this.init_select_all();
this.folder_open();
this.set_level_change_attr();
this.refresh_list();
this.runed = true
},
init_instruction_view() {
this.$instruction = new frappe.ui.Dialog(__("Job Details"));
// language=HTML
frappe.templates['job_instruction'] = ' Instruction:
{%= doc.instruction %}
\
Comment: {%= doc.commend %}
';
},
view_job_details(job){
let me = this;
frappe.call({
method: 'image_processing_com.z_file_manager.get_job_instruction',
args: {
file_name: job
},
callback: r => {
if (!r.xhr) {
me.$instruction.set_title(r.message.name);
$(me.$instruction.body).html(frappe.render_template('job_instruction', {doc: r.message}));
me.$instruction.show()
}
}
})
},
refresh_list() {
let me = this;
this.page.set_secondary_action(__("Refresh"), function () {
me.run()
});
},
set_permissions(){
if (in_array(frappe.user_roles, 'Processing')) {
this.permissions.can_assign = true;
this.permissions.can_read = true;
this.permissions.can_write = true;
this.permissions.can_delete = true;
if (this.root_folder.folder_type === "Download") {
this.permissions.can_set_level = true;
}
}
if (in_array(frappe.user_roles, 'QC')) {
this.permissions.can_assign = true;
this.permissions.can_read = true;
this.permissions.can_write = true;
}
if (in_array(frappe.user_roles, 'Designer')) {
if (in_array(["Designer", "Output"], this.root_folder.folder_type)) {
this.permissions.can_read = true;
}
if (in_array(["Output"], this.root_folder.folder_type)) {
this.permissions.can_write = true;
}
}
},
check_permission(permission){
return !!this.permissions[permission];
},
get_all_employees(){
let me = this;
frappe.call({
method: "image_processing_com.z_file_manager.get_active_employee",
args: {
filters: {
designation: "Designer"
}
},
callback(data){
if (data['message']) {
me.employees = data.message
}
else {
me.employees = []
}
},
freeze: true
});
},
set_level_change_attr: function () {
let me = this;
$(me.wrapper).on('change', 'select[name^="level"]', function () {
$(this).attr('data-change', true);
me.change_level_field()
})
},
change_level_field:function () {
let me = this;
let values = [];
$('select[data-change="true"][name^="level"]').each(function (i, el) {
values.push({
"name": $(el).closest('.z_list_item[data-name]').data('name'),
"val": $(el).val()
})
});
if (values.length) {
me.save_changed_levels(values)
}
},
save_changed_levels: function(values){
frappe.call({
method:"image_processing_com.z_file_manager.save_level",
args:{
"values": values
},
callback:function (r) {
if (r['message']) {
frappe.show_alert({
message: r.message,
indicator: 'green'
});
}else {
msgprint({
message: __("!Sorry, unable to set level please contact with System Admin"),
indicator: 'red'
}, __("ERROR"))
}
}
})
},
folder_open: function() {
let me = this;
$(me.wrapper).on("dblclick", ".z_list_item[data-type='Folder']", function () {
me.filter_list.clear_filters();
me.filter_list.add_filter("File", "folder", "=", $(this).data('name'));
me.run()
});
$(me.wrapper).on("click", ".z_list_item[data-type='Folder'] .view_instruction", function () {
me.view_job_details($(this).closest('.z_list_item').data('name'));
});
},
get_args: function(){
let args = {
doctype: this.doctype,
fields: ['`tabFile`.*','`tabSales Invoice`.total_qty', '`tabSales Invoice`.customer_job_no'],
filters: this.filter_list.get_filters(),
order_by: 'name desc',
save_list_settings: false,
limit_page_length: this.page_length,
limit_start: this.start,
join_on: {
'`tabFile`': 'job_no',
'`tabSales Invoice`': 'name'
}
};
args.filters = args.filters.concat(this.filter_list.default_filters);
return args;
},
render_header: function () {
$(frappe.render_template('image_list_header', {}))
.appendTo(this.wrapper.find('.list-headers'));
this.set_up_folder_action();
this.filter_list.wrapper.find('.show_filters').addClass('hide')
},
set_up_folder_action() {
let folder = this.wrapper.find('.up_folder');
let me = this;
folder.on('click', function () {
let folder_parent = me.filter_list.get_filter('folder').value.split('/');
folder_parent.pop();
folder_parent = folder_parent.join('/');
me.filter_list.clear_filters();
me.filter_list.add_filter("File", "folder", "=", folder_parent);
me.run();
});
},
toggle_up_folder() {
let folder = this.wrapper.find('.up_folder');
if (folder && this.filter_list.get_filter('folder').value.includes('/')) {
folder.show()
}else {
folder.hide()
}
},
render_view:function(data){
this.toggle_up_folder();
this.get_level_lists();
for (let i = 0; i < data.length; i++) {
if (this.root_folder.folder_type === "Designer" && this.filter_list.get_filter('folder').value === this.root_folder.name && !(in_array(frappe.user_roles, 'QC') || in_array(frappe.user_roles, 'Processing'))) {
if (data[i].name !== this.root_folder.name + '/' + frappe.boot.employee.name) {
continue
}
}
this.rows_html[data[i].name] = {};
this.rows_html[data[i].name].$wrapper = $(frappe.render_template('image_thumbnail', {data: data[i], level_lists: this.level_lists, can_set_level: this.check_permission('can_set_level')}))
.appendTo(this.wrapper.find('.result-list'));
this.rows_html[data[i].name].$level_wrapper = this.rows_html[data[i].name].$wrapper.find('.level_wrapper');
}
this.wrapper.find('.result').css('overflow', 'hidden');
},
get_level_lists: function () {
let me = this;
me.level_lists = [];
frappe.call({
method: "image_processing_com.zenith.doctype.level.level.get_levels",
async: false,
callback:function (data) {
if (data['message']) {
me.level_lists = data.message
}
}
})
},
init_select_all:function () {
let me = this;
$(".list-select-all").on("click", function () {
$(me.wrapper).find('.list-delete').prop("checked", $(this).prop("checked"));
me.toggle_actions();
});
$(me.wrapper).on("click", ".list-delete", function (event) {
me.toggle_actions();
// multi-select using shift key
let $this = $(this);
if (event.shiftKey && $this.prop("checked")) {
let $end_row = $this.parents(".list-row");
let $start_row = $end_row.prevAll(".list-row")
.find(".list-delete:checked").last().parents(".list-row");
if ($start_row) {
$start_row.nextUntil($end_row).find(".list-delete").prop("checked", true);
}
}
});
// after delete, hide delete button
me.toggle_actions();
},
get_selected_items:function (type) {
let me = this;
let selected_f_or_f = me.page.main.find(".list-delete:checked");
if (!selected_f_or_f.length) {
msgprint(__("Please select minimum one file or folder"));
return
}
return jQuery.map( selected_f_or_f, function( a ) {
let $el = $(a).closest('.z_list_item');
if (typeof type === 'undefined' || $el.data('type')=== type) {
return $el.data('name')
}
});
},
download:function () {
let files = this.get_selected_items();
if (files) {
frappe.call({
method:"image_processing_com.z_file_manager.download",
args:{
files:files
},
callback:function (data) {
if (data['message']) {
window.open(data.message.url, '_blank').focus();
}
}
})
}
},
assign:function () {
let me = this;
frappe.prompt([
{
fieldname:'employee',
fieldtype:'Link',
options:'Employee',
reqd: 1,
label: __("Employee")
}
], function (values) {
me.call_assign_method({
employee: values.employee,
files: me.get_selected_items()
})
});
},
f_delete:function () {
let me = this;
let files = this.get_selected_items();
if (files) {
frappe.call({
method:"image_processing_com.z_file_manager.delete",
args:{
files:files
},
callback:function (data) {
if (data['message']) {
for (let i = 0; i < files.length; i++) {
me.page.main.find("[data-name='"+files[i]+"']").remove();
}
me.toggle_actions();
frappe.show_alert({message:__(data.message), indicator:'red'});
}
}
})
}
},
render_buttons: function(){
let me = this;
this.page.clear_actions_menu();
if (this.check_permission('can_set_level')) {
me.page.add_action_item("Set Level", function(){
if (!me.muti_level_prompt) {
me.set_level();
me.muti_level_prompt.show()
}else {
me.muti_level_prompt.show()
}
});
}
if (in_array(["Download"], this.root_folder.folder_type) && this.check_permission('can_assign')) {
me.page.add_action_item("Assign To Multiple", function(){me.multiple_assign()});
me.page.add_action_item("Assign To", function(){me.assign()});
}
if (this.check_permission('can_delete')) {
me.page.add_action_item("Delete", function(){
frappe.confirm(__("Are you sure you want to Delete"), function () {
me.f_delete()
});
});
}
/*if (in_array(["Designer"], this.root_folder.folder_type) && in_array(frappe.user_roles, 'Designer') && this.check_permission('can_read')) {
me.page.add_action_item("Hold", function(){
me.hold_by_emp();
});
}
if (in_array(["Designer"], this.root_folder.folder_type) && in_array(frappe.user_roles, 'Designer') && this.check_permission('can_read')) {
me.page.add_action_item("Back", function(){
me.back_file();
});
}*/
if (in_array(["Designer"], this.root_folder.folder_type) && in_array(frappe.user_roles, 'Designer') && this.check_permission('can_read')) {
me.page.add_action_item("Done", function(){
me.done_by_designer();
});
}
if (in_array(["QC"], this.root_folder.folder_type) && in_array(frappe.user_roles, 'QC') && this.check_permission('can_read')) {
me.page.add_action_item("Done", function(){
me.done_by_designer('Upload');
});
}
if (in_array(["Upload"], this.root_folder.folder_type) && in_array(frappe.user_roles, 'Processing') && this.check_permission('can_read')) {
me.page.add_action_item("Uploading", function(){
me.move_folder_to('Uploading', true);
});
}
if (in_array(["Uploading"], this.root_folder.folder_type) && in_array(frappe.user_roles, 'Processing') && this.check_permission('can_read')) {
me.page.add_action_item("Upload Backup", function(){
me.move_folder_to('Upload Backup', true);
});
}
if (in_array(["Download", "Output"], this.root_folder.folder_type) && in_array(frappe.user_roles, 'QC')
&& frappe.boot['employee']) {
me.page.add_action_item("Assign To Me", function(){me.assign_qc_himself()});
}
this.delete_empty_folder_btn()
},
delete_empty_folder_btn() {
let me = this;
this.page.add_action_item(__("Delete Empty Folder"), function(){me.delete_empty_folder()});
},
delete_empty_folder(){
let me = this;
frappe.call({
method: 'image_processing_com.z_file_manager.check_empty_folder_and_delete',
args: {
folders: me.get_selected_items('Folder')
},
freeze: true,
freeze_message: __("Deleting Empty Folder"),
callback: data => {
if(!data.xhr) {
me.run()
}
}
})
},
move_folder_to(to_folder, move_org) {
let me = this;
if (!move_org) {
}
frappe.call({
method: "image_processing_com.z_file_manager.move_folder",
args: {
files: me.get_selected_items("Folder"),
from_root: me.root_folder.name,
to_root: to_folder,
move_org_file: move_org
},
callback: function(data){
if (!data.xhr) {
frappe.show_alert(__("Done"))
// me.check_and_delete_empty_files("Done");
}
}
});
},
assign_qc_himself() {
this.call_assign_method({
employee: frappe.boot['employee'].name,
root: this.root_folder.name,
type: "Assign to QC",
files: this.get_selected_items()
})
},
hold_by_emp() {
console.log("Hi")
},
back_file() {
},
done_by_designer(target_folder, is_delete_org_folder) {
let me = this;
let employee = this.get_employee_from_folder();
if (!employee) {
return
}
if (!target_folder) {
target_folder = 'Output'
}
frappe.call({
method: 'image_processing_com.z_file_manager.designer_action',
args: {
type: 'Finished',
root_folder: me.root_folder.path,
to_root: target_folder,
move_folder: '',
employee: employee,
files: me.get_selected_items(),
is_delete_org_folder: is_delete_org_folder || ''
},
freeze: true,
freeze_message: __("Updating..."),
callback: function(data){
if (!data.xhr) {
frappe.show_alert(__("Done"))
// me.check_and_delete_empty_files("Done");
}
}
})
},
get_employee_from_folder() {
let splt_val = this.filter_list.get_filter('folder').value.split('/');
if (splt_val.length > 1) {
return splt_val[1]
}
return null
},
multiple_assign(){
if (!this.generated_multi_assign) {
this.init_multiple_assign();
}
this.multiple_assign_employee.$dialog.show()
},
init_multiple_assign(){
this.multiple_assign_employee = {};
this.multiple_assign_employee.$dialog = new frappe.ui.Dialog({
title: "Multiple Assign",
fields: [
{"fieldtype": "HTML", "label": __("Employees"), "fieldname": "employees"}
]
});
this.multiple_assign_employee.$employeeBody = $(frappe.render_template('employee_dialog', {employees: this.employees}))
.appendTo(this.multiple_assign_employee.$dialog.fields_dict.employees.$wrapper);
this.multiple_assign_employee.$employeeBody.on('click', '.list-group-item[data-name]', function () {
$(this).toggleClass('active')
});
let me = this;
this.multiple_assign_employee.$dialog.set_primary_action(__("Assign"), function () {
let data = {
employee:[],
files:me.get_selected_items()
};
me.multiple_assign_employee.$employeeBody.find('.list-group-item[data-name].active').each(function (idx, el) {
data.employee.push($(el).attr('data-name'))
});
me.call_assign_method(data)
});
},
call_assign_method(data){
let me = this;
frappe.call({
method: 'image_processing_com.z_file_manager.assign',
args: data,
callback: function (r) {
if (r['message']) {
frappe.show_alert({
message: 'Successfully Assign',
indicator: 'green'
});
if (typeof me.multiple_assign_employee !== 'undefined') {
me.multiple_assign_employee.$dialog.hide();
}
me.run();
me.toggle_actions();
}else {
msgprint({
message: __("!Sorry, unable to Assign please contact with System Admin"),
indicator: 'red'
}, __("ERROR"))
}
}
});
},
set_level: function () {
let me = this;
me.muti_level_prompt = frappe.prompt({
"fieldname": "level",
"fieldtype": "Link",
"options": "Level",
"label": __("Level")
},function (data) {
let values =[];
me.get_selected_items();
me.get_selected_items().forEach(function (item) {
let $item = $('.z_list_item[data-name="' + item + '"]');
if ($item && $item.data('type') === 'File') {
$item.find('select[name^="level"]').val(data.level).attr('data-change', true)
}else if ($item && $item.data('type') === 'Folder') {
values.push({
"name": item,
"val": data.level
});
}
});
if (values.length) {
me.save_changed_levels(values)
}
me.change_level_field()
},__("Select Level"),__("Set"));
},
toggle_actions: function () {
let me = this;
if (me.page.main.find(".list-delete:checked").length) {
//show buttons
$(me.page.actions_btn_group).show();
$(me.page.btn_primary).hide();
$(me.page.btn_secondary).hide()
} else {
//hide button
$(me.page.actions_btn_group).hide();
$(me.page.btn_primary).show();
$(me.page.btn_secondary).show()
}
},
default_setup: function () {
if (!this.root) {
this.set_default_root()
}
},
set_page_title:function () {
if (this.root_folder['title']) {
this.page.set_title(this.root_folder['title'])
}
}
});
function url_validate(url) {
if (typeof url !== "string") {
console.warn("url_validate(url) must be receive a string type value");
return
}
return url.replace('//','');
}
//Get file base name
function get_base_name(str) {
return String(str).substring(str.lastIndexOf('/') + 1);
}
function in_array(array, value) {
if (array.indexOf !== undefined) {
return array.indexOf(value) !== -1;
}
for (let i = 0; i < array.length; i++) {
if (array[i] === value) {
return true;
}
}
return false;
}