Make a "Copy" button

Forums Classic DFFS Make a "Copy" button

Viewing 20 reply threads
  • Author
    Posts
    • #23991
      Steve
      Participant

      Hi guys,
      I need some help and have a few questions about a “copy” button.

      I have a list of items – when I click on “create a new item” the form is initiated. At the bottom side, there are two types of buttons – cancel and save. I would like to add another button titled “Copy” which would work like – “save this item to the current list and copy “selected (10 fields max)” fields and initiate another new form where the copied fields would be automatically imported”.

      Does DFFS support this? Is it possible to make it? The attachement is just an example. Select, for example, two first fields — click on “Copy” — automatically save the current item and initiate a new form with filled fields.

      Thank you very much for any response.

    • #24002
      Alexander Bautz
      Keymaster

      Hi,
      Add this to your Custom JS in NewForm:

      // If creating a copy
      if(GetUrlKeyValue("CreateCopy") === "1"){
          var str = sessionStorage.getItem("SaveAndCreateNewData"), data;
          if(str !== null){
              data = JSON.parse(str);
              jQuery.each(data,function(fin,val){
                  setFieldValue(fin,val); 
              });
          }
      }
      
      // Add button
      jQuery("input[id$='_diidIOSaveItem']").before("<input type='button' class='ms-ButtonHeightWidth' style='margin-right:4px;' value='Save and Copy' onclick='saveAndCopy()' />");
      
      var createCopyWhenSaving = false;
      function saveAndCopy(){
          createCopyWhenSaving = true;
          spjs.dffs.triggerSave();
      }
      
      function dffs_PreSaveAction(){
          if(createCopyWhenSaving){
              var arr = [
                  "EmailAddress",
                  "FirstName",
                  "Floor",
                  "ID",
                  "LastName",
                  "LeaseStartDate",
                  "PhoneNumber",
                  "ShortTermLease",
                  "Title"
              ];
              var data = {};
              jQuery.each(arr,function(i,fin){
                  data[fin] = getFieldValue(fin);
              });
              sessionStorage.setItem("SaveAndCreateNewData",JSON.stringify(data));
              // Redirect
              spjs.dffs.redirect(location.pathname + "?CreateCopy=1",false);
          }
          return true;
      }

      It will store the input in sessionStorage and pull it into the NewForm based on an URL parameter that is set when hitting the copy-button.

      You must ensure the array of fields have the correct FieldInternalNames.

      Let me know how this works out.

      Alexander

    • #24015
      Steve
      Participant

      Thank you very much for the code. I’m not great in javascript and coding such as. Please, could you tell me where I should put my “IDs (URLs)” of columns etc? At this moment, it does not work. But I probably have some mistakes in the code. Could you check it? Thank you once again.

      
      
      // If creating a copy
      if(GetUrlKeyValue("CreateCopy") === "1"){
          var str = sessionStorage.getItem("SaveAndCreateNewData"), data;
          if(str !== null){
              data = JSON.parse(str);
              jQuery.each(data,function(fin,val){
                  setFieldValue(fin,val);
              });
          }
      }
      
      // Add button
      jQuery("input[id$='_diidIOSaveItem']").before("<input type='button'
      class='ms-ButtonHeightWidth' style='margin-right:4px;' value='Save and Copy' onclick='saveAndCopy()' />");
      
      var createCopyWhenSaving = false;
      function saveAndCopy(){
          createCopyWhenSaving = true;
          spjs.dffs.triggerSave();
      }
      
      function dffs_PreSaveAction(){
          if(createCopyWhenSaving){
              var arr = [
                  "Cena"
                  "CenoveHladiny"
                  "Cena"
                  "StavSchvalovani"
                  "CenaZaPrepravku"
              ];
              var data = {};
              jQuery.each(arr,function(i,fin){
                  data[fin] = getFieldValue(fin);
              });
              sessionStorage.setItem("SaveAndCreateNewData",JSON.stringify(data));
              // Redirect
              spjs.dffs.redirect(location.pathname + "?CreateCopy=1",false);
          }
          return true;
      }
    • #24033
      Alexander Bautz
      Keymaster

      I’m not sure I understand – you have added the correct field internal names to the “arr” like this it should work

      var arr = [
                  "Cena"
                  "CenoveHladiny"
                  "Cena"
                  "StavSchvalovani"
                  "CenaZaPrepravku"
              ];

      Do you see the new button at the bottom of the form?

      Please note that if you already have a function named dffs_PreSaveAction in your form, you must merge the content of these two so you don’t have duplicate function names.

      Alexander

    • #24052
      Steve
      Participant

      Hi Alex,

      I’ve done everything. I don’t see a button at the bottom of the form. An error pops up – as you can see in the picture.

      In accordance with your last paragraph, dffs_PreSaveAction is not included in my form.
      One sidelight, I have a button “Load data” that is made in javascript above the form in webpart in content editor. It’s not made in DFFS. Could that be a problem?

      Thank you for your time Alex you spend with this article.

      Steve

      • This reply was modified 5 years ago by Steve.
      Attachments:
    • #24056
      Alexander Bautz
      Keymaster

      Not sure what the error message says – can you translate?

      You might need to correct the quotes used in the code snippet because they sometimes are replaced with the wrong type of quotes when copying and pasting. Please retype all single and double quotes and try again.

      Alexander

    • #24058
      Alexander Bautz
      Keymaster

      I had another look and you are missing commas in your array:

      var arr = [
                  "Cena",
                  "CenoveHladiny",
                  "Cena",
                  "StavSchvalovani",
                  "CenaZaPrepravku"
              ];

      Alexander

      • #24060
        Steve
        Participant

        I’m sorry Alexander but still I cannot see a button at the bottom of the form and the same error pops up whenever I put commas, for example: “Cena”, “StavSchvalovani”,.. Even if I remove them.
        The error says: The operation cannot be completed due to error 80020101. The Code looks like:

        
        
        // If creating a copy
        if(GetUrlKeyValue("CreateCopy") === "1"){
            var str = sessionStorage.getItem("SaveAndCreateNewData"), data;
            if(str !== null){
                data = JSON.parse(str);
                jQuery.each(data,function(fin,val){
                    setFieldValue(fin,val);
                });
            }
        }
        
        // Add button
        jQuery("input[id$='_diidIOSaveItem']").before("<input type='button'
        class='ms-ButtonHeightWidth' style='margin-right:4px;' value='Save and Copy' onclick='saveAndCopy()' />");
        
        var createCopyWhenSaving = false;
        function saveAndCopy(){
            createCopyWhenSaving = true;
            spjs.dffs.triggerSave();
        }
        
        function dffs_PreSaveAction(){
            if(createCopyWhenSaving){
                var arr = [
                    "%5Fx0031%5FatributPolozky",
                    "NazevPolozky",
                    "DruhPolozky",
                    "SubdruhPolozky",
                    "BaleniAhmotnost",
                ];
                var data = {};
                jQuery.each(arr,function(i,fin){
                    data[fin] = getFieldValue(fin);
                });
                sessionStorage.setItem("SaveAndCreateNewData",JSON.stringify(data));
                // Redirect
                spjs.dffs.redirect(location.pathname + "?CreateCopy=1",false);
            }
            return true;
        }
      • #24062
        Alexander Bautz
        Keymaster

        You have a line break in this line that you must remove:

        jQuery("input[id$='_diidIOSaveItem']").before("<input type='button' class='ms-ButtonHeightWidth' style='margin-right:4px;' value='Save and Copy' onclick='saveAndCopy()' />");

        Also, your field name “%5Fx0031%5FatributPolozky” is not correct – find the correct fieldinternalnames in the Fields tab in DFFS backend.

        When you write code you can use this site to check the syntax: https://jshint.com

        Alexander

    • #24064
      Steve
      Participant

      Alexander, it works! The break in that line was a mistake and that’s why it did not work out. Now, it’s working, but…

      If I create a new form, then I fill in columns, then I hit “Save and Copy” – the new for is initiated but it hasn’t saved.

    • #24077
      Alexander Bautz
      Keymaster

      I’m glad you go it running. I’m not sure I understand – is it the first form that doesn’t save?

      This code should save the initial item, and open a new “NewForm” after it is saved, but the new “copy” is not automatically saved because I assumed you wanted to have the opportunity to make changes to the item before saving it.

      If you want it to automatically save the second item, you can add spjs.dffs.triggerSave(); to the function like this:

      if(GetUrlKeyValue("CreateCopy") === "1"){
          var str = sessionStorage.getItem("SaveAndCreateNewData"), data;
          if(str !== null){
              data = JSON.parse(str);
              jQuery.each(data,function(fin,val){
                  setFieldValue(fin,val);
              });
              spjs.dffs.triggerSave();
          }
      }

      Alexander

    • #24112
      Steve
      Participant

      Thanks Alex, the first form doesn’t save. I do not need the second form to be saved automatically. I fill the columns in the NewForm, then I hit “Save and Copy”, another NewForm is initiated but its predecessor (first form) did not save at all.

      And you were right, I wan to make changes in the “copied” form.

      Steve

    • #24114
      Alexander Bautz
      Keymaster

      OK, do you have any other custom js running in this form that could interfere?

      If you hit F12 and select “Console” before saving – do you see any error messages when you hit the “Copy and save” button?

      You might have to select “Preserve log” in the console window so that the log isn’t cleared when you navigate to the new “NewForm”.

      Alexander

      • #24124
        Steve
        Participant

        Alex, It’s working so, there is no problem with those errors. I changed nothing, I was just looking at the wrong list on the same page. My mistake. When I clicked on the web “xxxxx” on SharePoint, the list has shown up where I use the javascript. But I had to click on the list at navigation panel.

        Now, all of it is working. Thank you very much Alex.

    • #24134
      Alexander Bautz
      Keymaster

      I’m glad you figured it out. I removed your two latest comments because you figured out what caused the problems and they no longer are relevant.

      Alexander

    • #24188
      Keith Hudson
      Participant

      As an alternative, would it be possible to use the vlookup functionality to create new items passing in fields from the current item, by selecting the current list as the target of the vlookup? It seems to me that I have used vlookup to SEE related items on the same list — would that also work for creating new items on the same list?

      • #24203
        Alexander Bautz
        Keymaster

        Yes, you should be able to do that with vLookup.

        Alexander

      • #24212
        Steve
        Participant

        If I understand the vLookup function, it won’t help me at all. Initiation of a form offers the author specific columns like -Type of product, the number of the product, the validity of price since, expiration dates etc.… If I always wanted to have the same data taking from another list (vLookup) then it would be a perfect way how to do it. But…

        There are too many specific data filling in the columns in the form, that means I need only some columns to be copied, but They always change. It’s hard for me to describe the situation, but the Copy button is the best way how to solve my problem out.

        • This reply was modified 5 years ago by Steve.
    • #27417
      John Garrido
      Participant

      Is there a way to modify this copy feature to include multi lookup fields? It seems like it should work as it appears to be in the correct format setFieldValue(“MultiLookup”,[“Option number 1″,”Option number 2”]). Thanks for any guidance!

    • #27422
      Alexander Bautz
      Keymaster

      This looks like it should work already – do you get an error?

      Which version of spjs-utility.js are you using (hover over the Enhanced with DFFS link to show the version info)?

      Alexander

    • #35185
      Jonathan Stamper
      Participant

      Let’s say I have an edit form of a completed item and I wanted to copy or duplicate that request on to a New Form. Would the same logic above work?

      • #35192
        Alexander Bautz
        Keymaster

        Yes, this is more or less what it does, but if you don’t want to actually save the “donor” form you should trigger the function by a button and not in the PreSaveAction function.

        Alexander

      • #35199
        Jonathan Stamper
        Participant

        Got it so instead of using presave just trigger via a function that takes the session storage, opens new form and drops it all in there?

    • #35206
      Jonathan Stamper
      Participant

      Oh I get it! The if(GetURLKeyValue…) is outside a function because it’s like my last step for the new form to pick up and copy the data over on. That’s cool.

      Is there a specific way I should render AC fields? It looks like they are coming in but not rendering exactly as they would if a user selects them in.

    • #35217
      Alexander Bautz
      Keymaster

      If you use an AC field you must not invoke the AC function on the field until you are done prefilling the fields from the localStorage object.

      Alexander

      • #35224
        Jonathan Stamper
        Participant

        Ah that’s right I forgot about the invoke functions available from the AC manuals and references. Much appreciated as always!

      • #35238
        Jonathan Stamper
        Participant

        I had a chance to try and invoke and I’m getting a “TypeError: Cannot read properties of undefined (reading ‘items’). I’m trying to load in 2 AC fields (one is a multi-field). The error occurs right after executing the spjs.ac.setFieldValue section below:

        
        
        if(GetUrlKeyValue("CreateCopy") === "1"){
            var str = sessionStorage.getItem("SaveAndCreateNewData"), data;
            if(str !== null){
                data = JSON.parse(str);
                jQuery.each(data,function(fin,val){
                   If (fin===“field1” || fin===“field2”){
                     spjs.ac.setFieldValue(fin,Val);
                   } else {
                     setFieldValue(fin,val);
                   }
                 });
            }
      • #35242
        Jonathan Stamper
        Participant

        Oops, that’s supposed to be a lower case v for the val variable.

      • #35246
        Alexander Bautz
        Keymaster

        Hi,
        Before you apply the function spjs.ac.textField(…) you cannot use the spjs.ac.setFieldValue function – use the regular setFieldValue(fin, val) function instead.

        Alexander

      • #35252
        Jonathan Stamper
        Participant

        Oh, the order to which the AC is initiated to when the values are populated would cause that error I’m getting. Ok, I’ll check that out. Many thanks!

    • #35256
      Jonathan Stamper
      Participant

      Ah, I see I tried to include it in my dffs_ready() but that means I’d need to shut off all my rules and alerts to correctly do it. That is unless I shouldn’t do it in there.

    • #35258
      Alexander Bautz
      Keymaster

      Hi,
      You can do it in dffs_ready if you wrap it up something like this inside the function:

      if(GetUrlKeyValue("CreateCopy") === "1"){
          var str = sessionStorage.getItem("SaveAndCreateNewData"), data;
          if(str !== null){
              data = JSON.parse(str);
              jQuery.each(data,function(fin,val){
                   setFieldValue(fin,val);
               });
          }
      }
      spjs.ac.textfield(...);

      Alexander

    • #35271
      Jonathan Stamper
      Participant

      That was it. I needed to change the order of operations between the AC and the Create Copy. Big thanks!!!

      Now I just need to put in a logic for the children and I should be good.

Viewing 20 reply threads
  • You must be logged in to reply to this topic.